hdu1166敌兵布阵
敌兵布阵
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 32178 Accepted Submission(s): 13823
中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的.
每组数据第一行一个正整数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条命令
对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。
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
6
33
59
Statistic |
Submit |
Discuss |
Note
这种题是如果只要答案是非常简单的,只要每次都枚举一次就行了。
但是在acm中就绝对不可能如此简单额。。
这倒是最简单的线段树。。
今天刚学了线段树就用来实践一下。。
其实学线段树我不仅可以学到这个算法,还可以对建树的过程和对树的递归操作有了很大的提高额。。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
struct Enemy
{
int l,r;
int num;
}Enemy[250006];
int campsum[50006];
char op[][10] = {"Query","Add","Sub","End"};
void build_tree(int Start,int End,int No) //建树
{
if(Start>End)return;
Enemy[No].l = Start;
Enemy[No].r = End;
Enemy[No].num = campsum[End]-campsum[Start-1];
if(Start==End)return;
build_tree(Start,(Start+End)/2,No*2);
build_tree((Start+End)/2+1,End,No*2+1);
} int qu(int x,int y,int i)//查询
{
if(x==Enemy[i].l && y==Enemy[i].r)
return Enemy[i].num;
if(x>y)return 0;
if(y<=(Enemy[i].l+Enemy[i].r)/2)
return qu(x,y,i*2);
else if(x>=(Enemy[i].l+Enemy[i].r)/2+1)
return qu(x,y,i*2+1);
else
return qu(x,(Enemy[i].l+Enemy[i].r)/2,i*2)+qu((Enemy[i].l+Enemy[i].r)/2+1,y,i*2+1);
} void add(int x,int y,int i)//增加或者减少
{
if(Enemy[i].l==x && Enemy[i].r==x)
{
Enemy[i].num+=y;
return;
}
if(Enemy[i].l<=x && Enemy[i].r>=x)
{
Enemy[i].num+=y;
add(x,y,i*2);
add(x,y,i*2+1);
}
else return ;
} int main()
{
int t,N,i,var;
char ch[11];
scanf("%d",&t);
for(int ca=1;ca<=t;ca++)
{
campsum[0] = 0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d",&var);
campsum[i] = campsum[i-1]+var;
} build_tree(1,N,1);
printf("Case %d:\n",ca);
while(scanf("%s",ch))
{
for(i=0;i<4;i++)
if(strcmp(op[i],ch)==0)
break; if(i==3)
break;
int x,y;
switch(i)
{
case 0: scanf("%d%d",&x,&y);printf("%d\n",qu(x,y,1));break;
case 1: scanf("%d%d",&x,&y);add(x,y,1);break;
case 2: scanf("%d%d",&x,&y);add(x,-y,1);break;
}
} }
return 0; }
hdu1166敌兵布阵的更多相关文章
- hdu1166 敌兵布阵
敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动 ...
- 线段树 HDU-1166 敌兵布阵
敌兵布阵是一个线段树典题,题目如下(点此查看题目出处): Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国 ...
- HDU-1166敌兵布阵(线段树)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...
- hdu1166 敌兵布阵(线段树 求区间和 更新点)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU1166 敌兵布阵_线段树
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 线段树 - HDU1166 - 敌兵布阵
2017-07-29 16:41:00 writer:pprp 线段树跟区间操作相关,想要在题目限定的时间内解决问题就需要用线段树这种数据结构来解决: 线段树是一种二叉平衡树 参考书目:张新华的< ...
- 线段树——hdu1166敌兵布阵
一.题目回顾 题目链接:敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个 ...
- HDU1166 敌兵布阵(树状数组实现
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu1166 敌兵布阵 线段树(区间更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- POJ 1250 Tanning Salon
Tanning Salon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6822 Accepted: 3686 Des ...
- JQuery window、document、 body (转)
转自:http://www.cnblogs.com/luhe/archive/2012/11/08/2760619.html 我电脑屏幕分辨率:1440 * 900 最大化浏览器,刷新浏览器 al ...
- Linux UDP严重丢包问题的解决
测试系统在Linux上的性能发现丢包率极为严重,发210000条数据,丢包达110000之巨,丢包率超过50%.同等情形下Windows上测试,仅丢几条数据.形势严峻,必须解决.考虑可能是因为协议栈B ...
- ORACLE输出详细错误信息错误行数
... COMMIT; --输出成功信息 DBMS_OUTPUT.PUT_LINE('RUN RESULT: SUCCESS'); EXCEPTION WHEN OTHERS THEN BEGIN R ...
- Lesson 5: Typography in Product Design
Lesson 5: Typography in Product Design Article 1: Interactive Guide to Blog Typography 布局(Layout) 用空 ...
- MSSQL 字符串替换语句
MSSQL替换语句:update 表名 set 字段名=replace(cast(字段名 as varchar(8000)),'abc.com','123.com')例如:update PE_Arti ...
- 认识html标签
让我们通过一个网页的学习,来对html标签有一个初步理解. 平常大家说的上网就是浏览各种各式各样的网页,这些网页都是由html标签组成的. 下面就是一个简单的网页.效果图如下: 我们来分析一下,这个网 ...
- 用CALayer实现淡入淡出的切换图片效果
由于直接更改layer的contents显示的隐式动画切换的时候的动画持续时间没办法控制, 切换效果不尽人意,所以这里配合了CABasicAnimation实现淡入淡出的切换效果, 另外还可以使用组合 ...
- WPFPath素材
放在Viewbox中可固定比例 <!--五角星--> <Canvas Width="100" Height="100"> <Pat ...
- 武汉科技大学ACM :1008: A+B for Input-Output Practice (VIII)
Problem Description Your task is to calculate the sum of some integers. Input Input contains an inte ...