HDU1166敌兵布阵 线段树模板题

来源:互联网 发布:淘宝认证照片 编辑:程序博客网 时间:2024/06/04 18:56

题目:传送门

#include<iostream>#include<algorithm>#include<string>#include<cstring>#include<map>#include<queue>#include<cmath>#include<stack>#include<vector>#include<cstdio>#define MAXN 50000#define INF 1000000007using namespace std;int sum[MAXN<<2];int A[MAXN];int max(int a,int b){if(a>=b)return a;else return b;}void pushup(int rt){   sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){   if(l==r)   {      sum[rt]=A[l];      return ;   }   int m=(l+r)>>1;   build(l,m,rt<<1);   build(m+1,r,rt<<1|1);   pushup(rt);}void update(int L,int C,int l,int r,int rt){   if(l==r)   {      sum[rt]+=C;      return ;   }   int m=(l+r)>>1;   if(L<=m) update(L,C,l,m,rt<<1);   else update(L,C,m+1,r,rt<<1|1);   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)>>1;   int ans=0;   if(L<=m) ans+=query(L,R,l,m,rt<<1);   if(R>m) ans+=query(L,R,m+1,r,rt<<1|1);   return ans;}int main(){   int firts=1;   int t;   scanf("%d",&t);   while(t--)   {      int n;      scanf("%d",&n);      for(int i=1;i<=n;i++)         scanf("%d",&A[i]);      build(1,n,1);      char s[10];      int a,b;      cout<<"Case "<<firts++<<":"<<endl;      while(scanf("%s",s)==1)      {         if(strcmp(s,"End")==0)            break;         scanf("%d%d",&a,&b);         if(s[0]=='Q')         {            cout<<query(a,b,1,n,1)<<endl;            continue;         }         if(s[0]=='A')         {            update(a,b,1,n,1);            continue;         }         if(s[0]=='S')         {            update(a,-b,1,n,1);            continue;         }      }   }   return 0;}


原创粉丝点击