hdu--1166 线段树区间求和
2012-07-12 11:08
477 查看
线段树区间求和简单入门题目
对于每一次输入的数组序列建树
每一次增加减少操作为更新操作,更新过程每个端点的和都更新
对于每一次输入的数组序列建树
每一次增加减少操作为更新操作,更新过程每个端点的和都更新
#include <iostream> #include <string> using namespace std; #define MAX 50010 int num[MAX]; struct SegTree { int left,right,value; int calmid(){ return (left+right)/2; } }tt[MAX*3]; int bulid(int s,int t,int step) { tt[step].left=s; tt[step].right=t; if(tt[step].right==tt[step].left) return tt[step].value=num[s]; int mid=tt[step].calmid(); return tt[step].value=bulid(s,mid,step*2)+bulid(mid+1,t,step*2+1); } void update(int id,int x,int step) { tt[step].value+=x; if(tt[step].left==tt[step].right) return; int mid=tt[step].calmid(); if(id<=mid){ update(id,x,step*2); }else update(id,x,step*2+1); } int query(int s,int t,int step) { if(s<=tt[step].left&&tt[step].right<=t) return tt[step].value; int mid=tt[step].calmid(); if(t<=mid){ return query(s,t,step*2); }else if(s>mid){ return query(s,t,step*2+1); }else return query(s,t,step*2)+query(s,t,step*2+1); } int main() { int T,N,a,b; char c[10]; cin>>T; for(int q=1;q<=T;q++) { memset(tt,0,sizeof(tt)); memset(num,0,sizeof(num)); cin>>N; for(int i=1;i<=N;i++) cin>>num[i]; bulid(1,MAX,1); cout<<"Case "<<q<<":"<<endl; while(cin>>c) { if(c[0]=='E') break; else cin>>a>>b; if(c[0]=='A') update(a,b,1); else if(c[0]=='S') update(a,-b,1); else if(c[0]=='Q') cout<<query(a,b,1)<<endl; } } }
相关文章推荐
- hdu 1166(线段树入门区间求和)
- 敌兵布阵 HDU - 1166 (线段树单点修改区间求和模板)
- Hdu 1166 敌兵布阵 树状数组 或 线段树 单点更新,区间求和
- hdu 1166 敌兵布阵【线段树,单点增减,区间求和】
- HDU 1166 敌兵布阵(线段树,区间求和)
- HDU 1166 敌兵布阵(线段树单点更新区间求和)
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- hdu 1166 敌兵布阵(线段树-单点更新,区间求和)
- HDU 1166 敌兵布阵(线段树:点更新,区间求和)
- hdu 1166 线段树 单点修改 + 询问区间求和 (线段树模板)
- HDU 1166 敌兵布阵(区间求和&(线段树|树状数组))
- HDU 1166——敌兵布阵——————【线段树单点增减、区间求和】
- HDU 1166 敌兵布阵 (线段树 单点增减 区间求和 模板)
- HDU 1166 敌兵布阵(线段树:单点add,区间求和)
- HDU 1166 敌兵布阵(线段树点更新区间求和裸题)
- 线段树 hdu 1166 敌兵布阵 单点更新区间求和
- 学习线段树-【线段树-单点更新,区间求和】hdu 1166 -敌兵布阵
- hdu 1166线段树 单点更新 区间求和
- HDU 1166 敌兵布阵【线段树,树状数组入门题,单点更新,区间求和】
- hdu1166 敌兵布阵(线段树单点更新+区间求和)