hdu 1166 敌兵布阵

来源:互联网 发布:淘宝首页轮播图片尺寸 编辑:程序博客网 时间:2024/06/13 21:30

线段树,怎么说呢,牺牲更新的时间来优化查找的时间~

#include<iostream>#define maxn 50000#define ll long longusing namespace std;struct stu{int r,l;ll sum;};stu root[maxn*4];int n,a,b;void build(int left,int right,int x){root[x].l=left;root[x].r=right;if(left==right){cin>>root[x].sum;return;}int mid=(left+right)/2;build(left,mid,x*2);build(mid+1,right,x*2+1);root[x].sum=root[x*2].sum+root[x*2+1].sum;}ll que(int l,int r,int x){if(r==root[x].r&&l==root[x].l) return root[x].sum;if(r<=(root[x].l+root[x].r)/2) return que(l,r,x*2);if(l>=(root[x].l+root[x].r)/2+1) return que(l,r,x*2+1);else return que(l,(root[x].l+root[x].r)/2,x*2)+que((root[x].l+root[x].r)/2+1,r,x*2+1);}void upd(int x,int i,int ch){if(i>=root[x].l&&i<=root[x].r){root[x].sum+=ch;if(root[x].l==root[x].r) return;upd(x*2,i,ch);upd(x*2+1,i,ch);}}int main(){cin.sync_with_stdio(false);int t;cin>>t;int casee=1;while(t--){cin>>n;build(1,n,1);cout<<"Case "<<casee++<<":"<<endl;string cmd;while(cin>>cmd){if(cmd[0]=='E') break;if(cmd[0]=='Q'){cin>>a>>b;cout<<que(a,b,1)<<endl;}else if(cmd[0]=='A'){cin>>a>>b;upd(1,a,b);}else{cin>>a>>b;upd(1,a,-b);}}}return 0; }


0 0
原创粉丝点击