题目:
一行N个方格,开始每个格子里的数都是0。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上或者减去一个特定的值A。现在要求你能对每个提问作出正确的回答。1≤N≤100000,提问和修改的总数可能达到100000条。
输入:
一个n一个m
m行字符
+
+
+ x和y
输出:
正确的回答
样例输入:
20 //方格个数
6 //有几组操作
M 1 1
M 2 2
M 3 4
M 3 -5
M 6 7
C 2 6
样例输出:
8
思路:
线段树
就用线段树来模拟一下修改操作和统计操作就好了,然后注意一下细节
C o d e Code Code:
#include<cstdio>
#include<iostream>
using namespace std;
int x,y,m,n,tree[800001];
char ch;
void xiugai(int dep,int l,int r)//修改操作
{
int mid = (l + r) / 2; //中间值
if (l == r)//完了
{
tree[dep] += y;//累加
return ;//退出
}
if (x <= mid) xiugai (dep * 2, l ,mid);
else xiugai (dep * 2 +1 ,mid + 1 ,r);
tree[dep] += y;
}
int tongji(int dep,int l,int r,int ll,int rr)//统计操作
{
int mid = (l + r) / 2,ans = 0;
if(l == ll && r == rr) return tree[dep];//搜完了
if(ll <=mid) ans = tongji (dep * 2,l,mid,ll,min(mid,rr));
if(rr > mid)ans += tongji(dep * 2 + 1 ,mid+1,r,max(mid+1,ll),rr);
return ans;//返回答案值
}
int main()
{
scanf("%d%d", &n,&m);
for (int i = 1; i <= m; ++i)
{
getchar(); ch = getchar();
scanf("%d%d", &x,&y);
if (ch == 'M')//模拟
xiugai(1, 1, n);
if (ch == 'C')
printf("%d\n", tongji(1, 1, n, x, y));
}
return 0;
}