敌兵布阵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);elseupdate(1, x, -y);}}return 0;
}