敌兵布阵Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 133377 Accepted Submission(s): 55789 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。
Input 第一行一个整数T,表示有T组数据。
Output 对第i组数据,首先输出“Case i:”和回车,
Sample Input 1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End
Sample Output Case 1: 6 33 59 |
线段树入门:(单点更新+区间查询)
#include<bits/stdc++.h>
#define lon long long
using namespace std;
int N,M,a[100005];
struct node
{
int l,r,sum;
}tree[400020];
void build(int x,int l,int r)
{
tree[x].r=r;
tree[x].l=l;
if(tree[x].r==tree[x].l)
{
tree[x].sum=a[tree[x].r];
return ;
}
int mind=(tree[x].r+tree[x].l)/2;
build(x*2,l,mind);
build(x*2+1,mind+1,r);
tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
}
void update(int x,int m,int q)
{
if(tree[x].l==tree[x].r)
{
tree[x].sum+=q;
return;
}
int mind=(tree[x].r+tree[x].l)/2;
if(m<=mind)
update(x*2,m,q);
else
update(x*2+1,m,q);
tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
}
int find(int x,int l,int r)
{
if(tree[x].l>=l&&tree[x].r<=r)
return tree[x].sum;
int mind=(tree[x].r+tree[x].l)/2;
if(r<=mind)
return find(x*2,l,r);
else if(l>mind)
return find(x*2+1,l,r);
else
return find(x*2,l,r)+find(x*2+1,l,r);
}
int main()
{
ios::sync_with_stdio(false);
int test,x,y;int k=1;
cin>>test;
while(test--)
{
cin>>N;
for(int i=1;i<=N;i++)
cin>>a[i];
build(1,1,N);
string order;
cout<<"Case "<<k++<<":"<<endl;
while(cin>>order)
{
if(order=="End") break;
cin>>x>>y;
if(order=="Query")
cout<<find(1,x,y)<<endl;
else if(order=="Add")
update(1,x,y);
else if(order=="Sub")
update(1,x,-y);
}
}
return 0;
}