热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HDU1166敌军布阵:利用线段树计算区间和

在HDU1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。

敌兵布阵


Time Limit: 2000/1000 MS
(Java/Others)    Memory Limit: 65536/32768 K
(Java/Others)
Total Submission(s):
36199    Accepted Submission(s):
15308



Problem Description

class="panel_content">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

class="panel_content">第一行一个整数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


bubuko.com,布布扣 id="code_img_closed_e68a36fe-4ab1-4441-ad15-84a38c91c434" class="code_img_closed"
src="https://img.php1.cn/3cd4a/1eebe/cd5/1e3db12dd78db092.webp">bubuko.com,布布扣 id="code_img_opened_e68a36fe-4ab1-4441-ad15-84a38c91c434"
class="code_img_opened" Onclick="cnblogs_code_hide(‘e68a36fe-4ab1-4441-ad15-84a38c91c434‘,event)"
src="https://img.php1.cn/3cd4a/1eebe/cd5/60405fda58cd0acd.webp">
class="cnblogs_code_hide">

1 #include
2 #include
3 #define MAXN 50001
4 struct Node
5 {
6 int left,right;
7 int sum;
8 };
9 Node Tree[MAXN * 20];
10 int Num[MAXN];
11 int Builder(int root, int left, int right)
12 {
13 Tree[root].left = left;
14 Tree[root].right = right;
15 if(Tree[root].left == Tree[root].right){
16 return Tree[root].sum = Num[left];
17 }
18 int mid = (left + right) / 2;
19 int L = Builder(2 * root, left, mid);
20 int R = Builder(2 * root + 1, mid + 1, right);
21 return Tree[root].sum = L + R;
22 }
23 int Find(int root, int left, int right)
24 {
25 if(Tree[root].left > right || Tree[root].right < left){
26 return 0;
27 }
28 if(left <= Tree[root].left && Tree[root].right <= right){
29 return Tree[root].sum;
30 }
31 int L = Find(2 * root, left, right);
32 int R = Find(2 * root + 1, left, right);
33 return L + R;
34 }
35 int Update(int root, int pos, int val)
36 {
37 if(Tree[root].left > pos || Tree[root].right < pos){
38 return Tree[root].sum;
39 }
40 if(Tree[root].left == pos && Tree[root].right == pos){
41 return Tree[root].sum += val;
42 }
43 int L = Update(2 * root, pos, val);
44 int R = Update(2 * root + 1, pos, val);
45 return Tree[root].sum = L + R;
46 }
47 int main()
48 {
49 int i, j, t, n;
50 int pos, val, cas;
51 char c[11];
52 scanf("%d", &t);
53 cas = 1;
54 while(t--)
55 {
56 scanf("%d", &n);
57 for(i = 1; i <= n; i++){
58 scanf("%d", &Num[i]);
59 }
60 Builder(1, 1, n);
61 printf("Case %d:\n", cas++);
62 while(scanf("%s", c))
63 {
64 if(c[0] == E)break;
65 scanf("%d%d", &pos, &val);
66 if(c[0] == Q){
67 printf("%d\n", Find(1, pos, val));
68 }
69 if(c[0] == A){
70 Update(1, pos, val);
71 }
72 if(c[0] == S){
73 Update(1, pos, -val);
74 }
75 }
76 }
77 return 0;
78 }

View Code

 

HDU 1166 敌兵布阵(线段树求sum),布布扣,bubuko.com


推荐阅读
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 本文介绍如何从字符串中移除大写、小写、特殊、数字和非数字字符,并提供了多种编程语言的实现示例。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 探讨 HDU 1536 题目,即 S-Nim 游戏的博弈策略。通过 SG 函数分析游戏胜负的关键,并介绍如何编程实现解决方案。 ... [详细]
  • 版本控制工具——Git常用操作(下)
    本文由云+社区发表作者:工程师小熊摘要:上一集我们一起入门学习了git的基本概念和git常用的操作,包括提交和同步代码、使用分支、出现代码冲突的解决办法、紧急保存现场和恢复 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 本文介绍如何使用MFC和ADO技术调用SQL Server中的存储过程,以查询指定小区在特定时间段内的通话统计数据。通过用户界面选择小区ID、开始时间和结束时间,系统将计算并展示小时级的通话量、拥塞率及半速率通话比例。 ... [详细]
  • 本文探讨了如何在 F# Interactive (FSI) 中通过 AddPrinter 和 AddPrintTransformer 方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。 ... [详细]
  • 本文探讨了如何通过预处理器开关选择不同的类实现,并解决在特定情况下遇到的链接器错误。 ... [详细]
  • 1.执行sqlsever存储过程,消息:SQLServer阻止了对组件“AdHocDistributedQueries”的STATEMENT“OpenRowsetOpenDatas ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
author-avatar
bai小白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有