概述
开始学习线段树,先做一道简单题,增加信心。
此题要求对一列数进行某一项的增减操作和区间求和,那显然是线段树。
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <deque>
using namespace std;
const int maxn = 100000 + 5;
const int INF = 0x7fffffff;
int n, dat[2 * maxn - 1];
int T;
char order[6];
void init(int n_) {
n = 1;
while (n < n_) n *= 2;
for (int i = 0; i < 2 * n - 1; i++) dat[i] = 0;
}
void update(int k, int a, int sig) {
k += n - 1;
dat[k] += a * sig;
while (k > 0) {
k = (k - 1) / 2;
dat[k] = dat[2 * k + 1] + dat[2 * k + 2];
}
}
int query(int a, int b, int k, int l, int r) {
if (a >= r || b <= l) return 0;
if (a <= l && r <= b) return dat[k];
int mid = (r - l) / 2;
int vl = query(a, b, 2 * k + 1, l, l + mid);
int vr = query(a, b, 2 * k + 2, l + mid, r);
return vl + vr;
}
int main()
{
int n_, x, m;
scanf("%d", &T);
for (int t = 1; t <= T; t++) {
printf("Case %d:n", t);
scanf("%d", &n_);
init(n_);
m = n - 1;
for (int i = 0; i < n_; i++) {
scanf("%d", &x);
update(i, x, 1);
}
int a, b;
while (~scanf("%s", order)) {
int tag = 1;
char c = order[0];
if (c == 'E') break;
scanf("%d%d", &a, &b);
if (c == 'Q') {
printf("%dn", query(a - 1, b, 0, 0, n));
}
else {
if (c == 'S')
tag = -1;
update(a - 1, b, tag);
}
}
}
return 0;
}
敲完后一发AC,无坑点。
最后
以上就是多情高山为你收集整理的hdu 1166 敌兵布阵的全部内容,希望文章能够帮你解决hdu 1166 敌兵布阵所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复