HDU1166线段树板子
#我大爷的读入被卡了
#对于ADD,END什么的处理,开个char,然后判断s[0],嘛
自己调的代码~
#include <iostream> #include <math.h> #include <string.h> #include <vector> #include <map> #include <queue> #include <stdio.h> #include <algorithm> #include <cstdio> using namespace std; int n,input[500000]; struct node{ int l,r,sum; }tree[500000]; void build(int i,int l,int r) { tree[i].l=l; tree[i].r=r; if(l==r) { tree[i].sum=input[l]; return; } int mid=(l+r)>>1; build(i*2,l,mid); build(i*2+1,mid+1,r); tree[i].sum=tree[i*2].sum+tree[i*2+1].sum; } void update(int i,int id,int k) { if(tree[i].l==tree[i].r&&tree[i].l==id) { tree[i].sum+=k; return; } int mid=(tree[i].r+tree[i].l)>>1; if(id<=mid) { update(i*2,id,k); } else { update(i*2+1,id,k); } tree[i].sum=tree[i*2].sum+tree[i*2+1].sum; } int query(int i,int l,int r) { if(tree[i].l>=l&&tree[i].r<=r) { return tree[i].sum; } int ans=0; if(tree[i*2].r>=l) { ans+=query(i*2,l,r); } if(tree[i*2+1].l<=r) { ans+=query(i*2+1,l,r); } return ans; } int main( ) { /* 第一行一个整数T,表示有T组数据。 每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。 接下来每行有一条命令,命令有4种形式: (1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30) (2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30); (3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数; (4)End 表示结束,这条命令在每组数据最后出现; 每组数据最多有40000条命令 */ //freopen("925.in","r",stdin); int t; cin>>t; for(int i=1;i<=t;i++) { cin>>n; cout<<"Case "<<i<<":"<<endl; for(int j=1;j<=n;j++) { int a; scanf("%d",&input[j]); } build(1,1,n); int ok=0; /* cout<<tree[1].sum<<endl; cout<<tree[2].sum<<endl; cout<<tree[3].sum<<endl; cout<<tree[4].sum<<endl; cout<<tree[5].sum<<endl; cout<<tree[6].sum<<endl; */ while(ok==0) { char s[10]; cin>>s; if(s[0]=='E') { ok=1;break; } if(s[0]=='A'||s[0]=='S') { int i,k; scanf("%d%d",&i,&k); if(s[0]=='S') { k=-k; } update(1,i,k); } else { int i,j; scanf("%d%d",&i,&j); int ans=query(1,i,j); cout<<ans<<endl; } } } }

浙公网安备 33010602011771号