【HDU - 1166】敌兵布阵 (线段树模板 单点更新+ 区间查询)-程序员宅基地

技术标签: 线段树  HDU  2018暑假 第四周 训练1  

题干:

C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。 
中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的. 

Input

第一行一个整数T,表示有T组数据。 
每组数据第一行一个正整数N(N<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。 
接下来每行有一条命令,命令有4种形式: 
(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30) 
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30); 
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数; 
(4)End 表示结束,这条命令在每组数据最后出现; 
每组数据最多有40000条命令 

Output

对第i组数据,首先输出“Case i:”和回车, 
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。 

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

题目大意:

    中文题啦。

解题报告:

     每个线段树小萌新都必做的模板题。build建树(现用的板子跟此略有不同,不过其实还是要具体题目具体分析)pushdown没有用到因为没有区间更新操作。

      注意是单点更新还是单点覆盖更新,这关系到你的val是+=还是=。但是pushup中的更新都是=。

AC代码:

#include<bits/stdc++.h>

using namespace std;
const int MAXN = 50000 + 5;	
int n;
int a[MAXN];
struct TREE {
	int l,r;
	int val;
	int laz;	
} tree[4*MAXN];
void pushup(int cur) {
	tree[cur].val = tree[2*cur].val + tree[2*cur + 1].val; 
}
void build(int l ,int r,int cur) {
	if(l == r) {
		tree[cur].l = tree[cur].r = l;//写成tree[r].r 了。。 
		tree[cur].val = a[l];
		tree[cur].laz = 0;
		return ;//这步return必须加!不然就无限递归了。这就是为什么写递归函数,要将出口写在最前面,就是,不给他再次进入递归函数的机会! 
	}
	int m = (l+r)/2;
	tree[cur].l = l;
	tree[cur].r = r;
//	tree[cur].val = 0;
	build(l,m,2*cur);
	build(m+1,r,2*cur + 1);
	pushup(cur);
}
void pushdown(int l,int r,int cur) {
	int m = (l+r)/2;
	if(tree[cur].laz !=0) {
		tree[2*cur].val += (m-l+1) *tree[cur].laz;
		tree[2*cur].laz += tree[cur].laz;
		tree[2*cur + 1].val += (r-m) * tree[cur].laz;
		tree[2*cur + 1].laz += tree[cur].laz;
		tree[cur].laz = 0;
	}
}
//pl-pr为查询区间,l和r为树种 当前cur下标 
int query2(int pl,int pr,int l,int r,int cur) {
	if(pl<=l && pr>=r) return tree[cur].val; 
	pushdown(cur,l,r);
	int m = (l+r)/2;
	int res = 0;
	if(pl <= m) res += query2(pl,pr,l,m,2*cur);
	//下面这里是if啊!!不是else!!! 
	if(pr >= m+1) res += query2(pl,pr,m+1,r,2*cur + 1);
	return res;
}

void update1(int tar,int val,int l,int r,int cur) {
	if(l == r) {
		tree[cur].val +=val;
		tree[cur].laz +=val;
		return;//这步return必须加!不然就无限递归了。这就是为什么写递归函数,要将出口写在最前面,就是,不给他再次进入递归函数的机会! 
	}
	int m = (l + r)/2;
	if(tar<=m) update1(tar,val,l,m,2*cur);
	else update1(tar,val,m+1,r,2*cur + 1);
	pushup(cur);
}
int main()
{
	int t;
	int iCase = 0;
	int tmp1,tmp2;
	char op[10];
	cin>>t;
	while(t--) {
		printf("Case %d:\n",++iCase);
		scanf("%d",&n);
		for(int i = 1; i<=n; i++ ) {
			scanf("%d",&a[i]);
		}
		memset(tree,0,sizeof(tree));
		build(1,n,1);
//		printf("%d %d ",tree[1].l,tree[1].r); 
//		for(int i = 1; i<=100; i++) printf("%d ",tree[i].val);
		while(scanf("%s",op) ) {
			if(op[0] == 'E') break;
			else if(op[0] == 'A') {
				scanf("%d%d",&tmp1,&tmp2);
				update1(tmp1,tmp2,1,n,1);
			}
			else if(op[0] == 'S') {
				scanf("%d%d",&tmp1,&tmp2);
				update1(tmp1,-tmp2,1,n,1);
			}
			else if(op[0] == 'Q') {
				scanf("%d%d",&tmp1,&tmp2);
				printf("%d\n",query2(tmp1,tmp2,1,n,1));
			}
		}
	}
	
	return 0 ;
 } 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41289920/article/details/81584611

智能推荐

蓝桥杯Python组国二经验+备考建议-程序员宅基地

文章浏览阅读1.9w次,点赞141次,收藏834次。楼主参加了2021年的蓝桥杯算法程序竞赛Python组。经过长达半年的训练+比赛时候的一点点运气,最终获得了蓝桥杯Python组省一国二的好成绩。只要好好准备,Python组的省一并没有那么难,我今年10道题中做了7道就拿到了省一等奖。本篇经验适合:1.希望参加Python组的同学2.想参加Java、C++ B组的同学(难度与Python组类似)3.想系统提升算法能力的同学4.ACM大佬可以直接退出了、点击就送总结:1.要总结并背诵基本的算法模板2.需要一定的训练量,但更追求的是写题质量和_蓝桥杯python组

PHP 浮点数计算精度问题_php float 精度-程序员宅基地

文章浏览阅读1.2k次。​ 在计算机中,只有二进制的数据才能被识别和处理。所以无论是哪种编程语言,在什么编译环境下工作,都要先把源程序(编译)转换成二进制的机器码后才能被计算机识别。二进制的方式可以准确表示一个整数,但不能准确表示一个浮点数。和十进制无法精确表示分数的1/3同样,二进制也无法精确表示十进制的小数。我们可以看下面的例子:// 但是对于浮点数来说,二进制并不能完整地表示一个浮点数。// 例如,我们将浮点数 2.4 表示为二进制,此时不能使用 decbin(), bindec()等类似的php系统函数。这里我是用在线_php float 精度

常见的十大运算符及其优先级_运算符优先级-程序员宅基地

文章浏览阅读1.1w次,点赞18次,收藏99次。常见运算符及其优先级_运算符优先级

最长公共子串的问题(正常方法和矩阵法,动态规划)-程序员宅基地

文章浏览阅读1.1k次。这个题我本人看着在网上没有详细的解释,其实你要搞懂一个问题,整体是让你求最长公共子串的长度比较简单,一直双重遍历,比较 最长子串的长度,但是如果最后要你那个最长公共子串难度会有一个提升,首先下面第一种方法我用双重遍历去找一下,找到最长公共子串,找到最长公共子串的关键是用map去储存字符串,这样以len为键一下就找到了最长公共子串。是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。,返回这两个字符串的最长。矩阵法:简单的动态规划。

Android图片压缩框架Tiny学习记录_android tiny-程序员宅基地

文章浏览阅读2.9k次。Android Tiny Compress_android tiny

黑马程序员——Java基础---I/O流(上[异常])_gephi显示java调用目标异常-程序员宅基地

文章浏览阅读512次。——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——- 引言 讲解IO流之前为什么先讲解异常和File类呢? 因为File表示的是IO流将来要操作的文件,所以我们需要学习File类。 而操作文件无非就是上传文件和下载文件,在这个操作的过程中可能出现问题, 出现问题后,我们需要对对应的代码进行处理。所以我们需要学习异常异常。 I/O流操作之上传下载 异_gephi显示java调用目标异常

随便推点

AppsFlyer Unity V6_edm4u-程序员宅基地

文章浏览阅读1.8k次。AppsFlyer Unity Plugin V6踩坑记录Unity plugin V6 插件链接首先粗略讲一下EDM4U(Unity外部依赖管理器)。EDM4U类似于一个插件管理器,通过Android Resolver 和 iOS Resolver来进行库文件的下载、更新、去重等,目前新的facebook,google,appsflyer等插件都自带这两个玩意儿了。iOS开发需要注意一点,没有安装CocoaPods,则需要使用/Assets/External Dependency Manage_edm4u

【JAVA秒会技术之玩转SQL】MySQL优化技术(一)_java mysql语句中,表关联,sql会如何优化-程序员宅基地

文章浏览阅读2.3k次。MySQL优化技术(一) 开发的路上,总会碰到一些老系统,越用越慢。“慢”的原因也许有很多,但是,博主个人觉得,数据库的设计和sql语句写的好坏,对系统效率的影响是最直接,最显而易见的!所以,学习一下MySQL的优化,还是很有必要的。当然,博主能力有限,没那么多经验,更多的是“道听途说”和“纸上谈兵”。如有不正之处,望大神开后给予指正,不胜感激!(一)MySQL优化技术概述_java mysql语句中,表关联,sql会如何优化

ros的l2tp服务端创建与pptp多出口配置-程序员宅基地

文章浏览阅读5.4k次。小二最近为了搭建自已的动态IP池,同时为了让苹果终端也能正常使用,初次引入了ros系统,纯属分享,如果不对之处请大神们多指点。Ros基础网络配置不再描述,前提保证ros本身能正常上网。l2tp服务端的配置l2tp的pool配置点击IP -> Pool,点击“+”,添加VPN ip地址池。Name:比如l2tp-poolAddress:比如10.1.1.1-10.1.1.253 ...

【MySQL进阶之路丨第十篇】一文带你精通MySQL排序、分组、连接_mysql 分组排序-程序员宅基地

文章浏览阅读1w次,点赞55次,收藏46次。MySQL中可以使用ORDER BY语句对查询结果进行排序。ORDER BY语句按照指定的列或表达式对结果进行排序,可以按升序(默认)或降序排列。模板如下:SELECT column1, column2, ...FROM tableORDER BY {{column}} {{order}};将需要排序的列名替换为{{column}},并将排序顺序(ASC或DESC)替换为{{order}}MySQL中可以使用ORDER BY语句对查询结果进行排序。ORDER BY语句按照指定的列或表达式_mysql 分组排序

解决java.net.ConnectException: Connection refused: connect报错_apache. der by.client .am.disconnectexception: jav-程序员宅基地

文章浏览阅读312次。在application.yml配置文件中加入:eureka: client: register-with-eureka: false fetch-registry: false_apache. der by.client .am.disconnectexception: java.net.connectexcetionerror

Golang.org/x库初探2——text库_golang.org/x/text-程序员宅基地

文章浏览阅读1.6k次。golang/x 库下text库详解,提供国际化、编码转换等丰富功能_golang.org/x/text