热门标签 | 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


推荐阅读
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • importjava.io.*;importjava.util.*;publicclass五子棋游戏{staticintm1;staticintn1;staticfinalintS ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • publicclassBindActionextendsActionSupport{privateStringproString;privateStringcitString; ... [详细]
  • 本文介绍了如何通过C#语言调用动态链接库(DLL)中的函数来实现IC卡的基本操作,包括初始化设备、设置密码模式、获取设备状态等,并详细展示了将TextBox中的数据写入IC卡的具体实现方法。 ... [详细]
  • 本文详细介绍了C++中的构造函数,包括其定义、特点以及如何通过构造函数进行对象的初始化。此外,还探讨了转换构造函数的概念及其在不同情境下的应用,以及如何避免不必要的隐式类型转换。 ... [详细]
  • 数据类型--char一、char1.1char占用2个字节char取值范围:【0~65535】char采用unicode编码方式char类型的字面量用单引号括起来char可以存储一 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • JUnit下的测试和suite
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 如何从BAM文件绘制ATAC-seq插入片段长度分布图?
    在ATAC-seq数据处理中,插入片段长度的分布图是一个重要的质量控制指标,它能反映出核小体的周期性排列。本文将详细介绍如何从BAM文件中提取并绘制这些数据。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
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社区 版权所有