概述
模板题,用得线段树。
#include<iostream>
#include<string.h>
#include<string>
#include<stack>
#include<stdio.h>
#include<queue>
#include<functional>
#include<set>
#include<map>
#include<stdlib.h>
#include<vector>
#include<math.h>
#include <algorithm>
#pragma warning(disable:4996)
using namespace std;
int a[500010];
char s[60];
int sum[500001];
int q;
void build(int node, int left, int right)
{
if (left == right)
sum[node] = a[left];
else
{
int middle = (left + right) / 2;
build(2 * node, left, middle);
build(2 * node + 1, middle + 1, right);
sum[node] = sum[2 * node] + sum[2 * node + 1];
}
}
void add(int node, int left, int right, int find, int v)
{
if (left == right)
sum[node] += v;
else
{
int middle = (left + right) / 2;
if (find <= middle)
add(2 * node, left, middle, find, v);
if (find>middle)
add(2 * node + 1, middle + 1, right, find, v);
sum[node] += v;
}
}
void getsum(int node, int left, int right, int L, int R)
{
if (right<L || left>R) return;
if (L <= left && right <= R)
q += sum[node];
else
{
int middle = (left + right) / 2;
getsum(2 * node, left, middle, L, R);
getsum(2 * node + 1, middle + 1, right, L, R);
}
}
int main()
{
int n, i, j,t,count=1;
scanf("%d",&t);
while (t--)
{
scanf("%d", &n);
memset(sum, 0, sizeof(sum));
memset(a, 0, sizeof(a));
for (i = 1; i <= n; i++)
scanf("%d", &a[i]);
build(1, 1, n);
printf("Case %d:n", count++);
while (~scanf("%s", s)&&s[0]!='E')
{
if (s[0] == 'Q')
{
int A, B;
q = 0;
scanf("%d%d", &A, &B);
getsum(1, 1, n, A, B);
printf("%dn", q);
}
if (s[0] == 'A')
{
int A, B;
scanf("%d%d", &A, &B);
add(1, 1, n, A, B);
}
if (s[0] == 'S')
{
int A, B;
scanf("%d%d", &A, &B);
add(1, 1, n, A, -B);
}
}
}
return 0;
}
最后
以上就是可耐大叔为你收集整理的C - 敌兵布阵的全部内容,希望文章能够帮你解决C - 敌兵布阵所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复