您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: