敌国布阵(线段树)

来源:互联网 发布:python数据采集 pdf 编辑:程序博客网 时间:2024/06/10 07:10
#include<stdio.h>#define maxn 50005struct Tree{   int left,right,sum;       }tr[maxn*3];int array[maxn];void build(int l,int r,int now){   tr[now].left=l; tr[now].right=r;   if(l==r)   {     tr[now].sum=array[l];     return;   }     int mid=(l+r)/2;   build(l,mid,now*2);   build(mid+1,r,(now*2)+1);   tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;}void update(int now,int goal,int add){  if(tr[now].left==tr[now].right)  {  tr[now].sum+=add; return ;}   int mid=(tr[now].left+tr[now].right)/2;  if(goal<=mid)  {     update(now*2,goal,add);          }    else     update(now*2+1,goal,add);  tr[now].sum=tr[now*2].sum+tr[now*2+1].sum;}int query(int start,int end,int now){     if(start<=tr[now].left && tr[now].right<=end)     { return tr[now].sum;}     int ans=0;     int mid=(tr[now].left+tr[now].right)/2;     if(start<=mid)     {       ans+=query(start,end,now*2);              }     if(end>mid)      ans+=query(start,end,now*2+1);          return ans;}int main(){   int t,i,j,k,n,a,b,p,number;   char str[10];   //freopen("in.txt","r",stdin);   //freopen("out.txt","w",stdout);   scanf("%d",&t);   for(k=1;k<=t;k++)   {      printf("Case %d:\n",k);       scanf("%d",&n);       for(i=1;i<=n;i++)        scanf("%d",&array[i]);       build(1,n,1);         //for(i=1;i<=n*3;i++)       // printf("%d %d %d\n",tr[i].left,tr[i].right,tr[i].sum);       // printf("\n................\n");       while(scanf("%s",str))       {         if(str[0]=='E')          break;         if(str[0]=='Q')          {            scanf("%d %d",&a,&b);           printf("%d\n",query(a,b,1));                    }           if(str[0]=='A')         {           scanf("%d %d",&p,&number);           update(1,p,number);                    }         if(str[0]=='S')           {           scanf("%d %d",&p,&number);           update(1,p,-number);                    }                      }              } }

再次复习线段树,主要是改善风格和完善代码。

#include <stdio.h>#include <string.h>#define maxn 50050#define lson l , m , rt*2#define rson m+1 , r , rt*2+1int n;int sum[maxn<<2];int in[maxn];void PushUp(int rt){sum[rt]= sum[rt*2] + sum[rt*2+1];}void build(int l, int r, int rt){if(l == r) {sum[rt] = in[l];return ;}int m = (l + r)/ 2;build(lson);build(rson);PushUp(rt);}int query(int L,int R,int l,int r,int rt){if(L <= l && r <= R)return sum[rt];int m = (l + r) / 2;int ret = 0;if(L <= m) ret += query(L,R,lson);if(R > m) ret += query(L,R,rson);return ret;}void update(int index,int add,int l,int r,int rt){if(l == r){sum[rt] += add;return ;}int m = (l + r) / 2;if(index <= m) update(index ,add ,lson);else update(index ,add , rson);PushUp(rt);}int main(){int T,i,cas=1;char op[10];scanf("%d",&T);while(T--){printf("Case %d:\n",cas++);scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&in[i]);getchar();build(1,n,1);while(scanf("%s",op)){if(op[0]=='E')break;int a,b;scanf("%d%d",&a,&b);if(op[0]=='Q')printf("%d\n",query(a,b,1,n,1));else if(op[0] == 'S') update(a,-b,1,n,1);else update(a,b,1,n,1); } }}


原创粉丝点击