敌兵布阵Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 151658 Accepted Submission(s): 62898 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
Author Windbreaker
Recommend Eddy |
一样的代码,已发tle, 一发ac 。。。
#include<bits/stdc++.h>
using namespace std;
const int N = 50005;
int a[N], x, y;
struct node
{
int l, r, sum;
}t[N<<2];
void build(int x, int l, int r)
{
t[x].l = l, t[x].r = r;
if(l == r)
{
t[x].sum = a[l];
return ;
}
int mid = (l + r) >> 1;
build(x<<1, l, mid);
build(x<<1|1, mid + 1, r);
t[x].sum = t[x<<1].sum + t[x<<1|1].sum;
}
void update(int x, int i, int k)
{
if(t[x].l == t[x].r)
{
t[x].sum += k ;
return ;
}
int mid = (t[x].r + t[x].l) >> 1;
if(i <= mid) update(x<<1, i, k);
if(i > mid) update(x<<1|1, i, k);
t[x].sum = t[x<<1].sum + t[x<<1|1].sum;
}
int query(int x, int l, int r)
{
if(l <= t[x].l && t[x].r <= r) return t[x].sum;
int mid = (t[x].l + t[x].r) >> 1, res = 0;
if(l <= mid) res += query(x<<1, l, r);
if(r > mid) res += query(x<<1|1, l, r);
return res;
}
int main()
{
int T;
cin >> T;
for(int i = 1; i <= T; i++)
{
memset(t, 0, sizeof t);
int n; string s;
cin >> n;
for(int i = 1; i <= n; i++)
scanf("%d", a+i);
build(1, 1, n);
cout << "Case " << i << ':' << endl;
while(cin >> s)
{
if(s == "End") break;
cin >> x >> y;
if(s == "Query")
cout << query(1, x, y) << endl;
else if(s == "Add")
update(1, x, y);
else
update(1, x, -y);
}
}
return 0;
}