HDU - 1166  敌兵布阵     线段树

Problem

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


线段树详解:https://www.cnblogs.com/xenny/p/9801703.html

题意:

中文题,区间查询,单点跟新。

思路:

线段树模板题,代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 50010
int num[N];
struct Node
{int l,r,data;
} node[4*N];
void Build(int l, int r, int root)//建树
{//cout<<'a'<<endl;node[root].l=l;node[root].r=r;if(l==r)//找叶子结点{node[root].data=num[l];return;}int mid=(l+r)/2;Build(l,mid,root<<1);Build(mid+1,r,root<<1|1);node[root].data=node[root<<1].data+node[root<<1|1].data;//当前结点的值等于它左右子结点的和
}
void Update(int pos, int value, int root)//更新结点
{int l=node[root].l;int r=node[root].r;if(l==r){node[root].data=value;//找到要更新的叶子结点return;}int mid=(l+r)/2;if(pos<=mid)//查找左结点Update(pos,value,root<<1);else//查找右结点Update(pos,value,root<<1|1);node[root].data=node[root<<1].data+node[root<<1|1].data;//更新当前值
}
int Find(int L, int R, int root)//区间查找
{int l=node[root].l;int r=node[root].r;if(l==L&&r==R)//找到叶子结点,并更新值{return node[root].data;}int mid=(l+r)/2;if(R<=mid)return Find(L,R,root<<1);//左子树else if(L>mid)return Find(L,R,root<<1|1);//右子树elsereturn Find(L,mid,root<<1)+Find(mid+1,R,root<<1|1);查找左右子树更新当前节点的值
}
int main()
{int t;int n,m;char str[10];scanf("%d",&t);for(int cas=1; cas<=t; cas++){scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%d",&num[i]);}//cout<<'b'<<endl;Build(1,n,1);printf("Case %d:\n",cas);while(scanf("%s",str),strcmp(str,"End")){int a,b;scanf("%d%d",&a,&b);if(strcmp(str,"Query")==0){int temp=Find(a,b,1);printf("%d\n",temp);}else if(strcmp(str,"Add")==0){num[a]=num[a]+b;Update(a,num[a],1);}else if(strcmp(str,"Sub")==0){num[a]=num[a]-b;Update(a,num[a],1);}}}return 0;
}

HDU - 1166 敌兵布阵(线段树模板)(入门题)相关推荐

  1. HDU 1166 敌兵布阵(线段树:点更新,区间求和)

    HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...

  2. hdu 1166 敌兵布阵 (线段树)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. HDU 1166 敌兵布阵【树状数组】

    用树状数组很简单,太晚了,贴下代码睡觉去... 另,研究线段树的时候,发现网上流传着有几种不同的线段树,最正宗的是以单位区间为单位,只能处理线段:另外还有几种叶子结点是点的,这种也可以用来处理点,所以 ...

  4. hdu 1166 敌兵布阵(树状数组)

    题意:区间和 思路:树状数组 #include<iostream> #include<stdio.h> #include<string.h> using names ...

  5. HDU1166 敌兵布阵 [线段树模板]

    题意:在序列中修改单点和查询区间和 #include<iostream> #include<cstdio> #include<cstring> #define ls ...

  6. 树状数组板子题之一:hdu 1166 敌兵布阵

    树状数组板子题之一:hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手 ...

  7. hdu 1166 敌兵布阵(单点更新)

    hdu 1166 敌兵布阵(基本操作) 有三种操作:询问区间总和,增加某个兵营的兵的数目,减少某个兵营的兵的数目.实际上也只有两个. 在更新的时候,每到一个区间就把当前区间的sum增加对应的数目,到达 ...

  8. HDU - 1166敌兵布阵+HDU-1754 I Hate It (线段树单点更新——累加/最大值)

    线段树单点更新,模板题 HDU1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和T ...

  9. hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)

    敌兵布阵                                                                             Time Limit: 2000/10 ...

  10. HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

最新文章

  1. 【怎样写代码】工厂三兄弟之抽象工厂模式(五):扩展案例I
  2. 介绍Smart Client组件网站
  3. 高斯混合模型--GMM
  4. CTFshow 文件包含 web81
  5. java序列化 jar_使用序列化将对象传递给另一个JVM – 相同的Java版本和jar(都运行我们的应用程序)...
  6. AJAX框架衣柜内部布局,​最合理的衣柜内部布局解析,3大细节不容小觑
  7. 光流(一)--综述概览
  8. JVM的内存区域划分(转摘)
  9. 【CVRP】基于matlab模拟退火算法求解带容量的车辆路径规划问题【含Matlab源码 159期】
  10. 常平计算机培训班,常平大朗CNC编程培训速成班,一个月学会UG编程
  11. 联想拯救者R720黑苹果EFI分享
  12. 大数据项目实战之数据采集
  13. 杜立特尔分解法 MATLAB,杜立特分解法.doc
  14. 爬虫爬取知乎评论并利用flask框架做简单的可视化
  15. canvas画布上的文字随窗口大小变形
  16. 台式计算机32位和64位的区别,电脑装系统选择32位还是64位? 32位和64位系统有什么区别...
  17. C语言实现url的编码和解码
  18. 鲁大师2023年Q1手机报告:ColorOS蝉联榜首
  19. object-c中的对象的释放
  20. 输入一段英文句子,单词之间用若干空格隔开,将每个单词的首字母转换为大写字母。 例如,“I am very glad to see you”的转换结果为“I Am Very Glad To See Yo

热门文章

  1. baidu 快递查询API
  2. 便利蜂创始人数字化经验分享:如何用全链路数字化 重塑零售业
  3. 机器学习(七)白化whitening
  4. 关于Tensorflow模型保存与读取的问题
  5. 2022年最新的编程语言排名
  6. MAC Pro开机密码忘记了怎么办?
  7. 从汇编的角度分析函数调用过程(2)
  8. linux桌面小程序开发日记_1(pyqt5 + yolov5)
  9. python提取文件指定列_python 提取文件指定列的方法示例
  10. js日期格式化函数示例:将日期时间格式化成yyyy-mm-dd hh:ii:ss格式