hdu 1166 敌兵布阵
2015-08-03 23:31
288 查看
线段树,怎么说呢,牺牲更新的时间来优化查找的时间~
#include<iostream> #define maxn 50000 #define ll long long using 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; }
相关文章推荐
- js时间间隔和倒计时
- 数据结构之链表、栈和队列 java代码实现
- IOS绘图API绘制直线几何图形
- Oracle笔记-表的管理
- Android利用Binder类实现对服务的调用
- dom4j将xml转换成对象
- 父类不含无参构造方法子类构造方法必须显式调用
- Delphi二维码中文支持、分组、批量打印经验小结
- 递归
- 【LeetCode】198 - House Robber
- 失败的面试经历
- linux学习笔记 - 文档权限与目录配置
- c++运算符重载,输出符 4000 号重载
- Android之——获取进程总数、内存、任务列表
- H.264码流的RTP打包格式[FU-A]
- android studio imageview src Failed convert xxxx into drawable xxxx
- 将工程在Xcode6中打包成测试的ipa包
- 3D图形渲染管线
- Sort List
- hd4883 TIANKENG’s restaurant