hdu1166——敌兵布阵

该博客介绍了如何解决一个关于敌兵布阵的编程问题,其中涉及阵地士兵数量的变化。根据输入的指令,如增加或减少士兵、查询特定区间士兵总数,需要求解指定区间内的士兵总和。博主推荐使用树状数组作为解决方案,因为它在处理此类问题时相比线段树更为简单快捷。文章包含问题分析和相应代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:N个阵地的士兵个数是可能发生变化的,根据输入给出的操作,求出所查询的区间内的士兵总数

输入:

case个数T

阵地个数N

第i个阵地的人数a[i]

指令(四种:Add x y表示x阵地加y个人

                   Sub x y表示x阵地减y个人

                   Query x y表示查询x到y阵地的总人数

                   End表示结束case)

输出:区间内士兵总数

分析:树状数组。线段树也能做,但是这道题用树状数组比较简单快速。线段树比较适合记录区间内的特征值,例如最值等等。

代码:

#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
int N;
int a[50001];
int c[50001];
char command[10];
int x, y;
void update(int i, int val){
	while (i <= N){
		c[i] += val;
		i += i&(-i);
	}
}
int sum(int i){
	int total = 0;
	while (i > 0){
		total += c[i];
		i -= i&(-i);
	}
	return total;
}
int main(){
	int T,cases = 1;
	scanf("%d", &T);
	while (T--){
		scanf("%d", &N);
		memset(c, 0, sizeof(c));
		for (int i = 1; i <= N; i++){
			scanf("%d", &a[i]);
			update(i, a[i]);
		}
		printf("Case %d:\n", cases++);
		while (scanf("%s", command)){
			if (command[0] == 'E')
				break;
			scanf("%d %d", &x, &y);
			if (command[0] == 'Q'){
				printf("%d\n", sum(y) - sum(x - 1));
			}
			else if (command[0] == 'A'){
				update(x, y);
			}
			else if (command[0] == 'S'){
				update(x, -y);
			}
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值