线段树模板hdu 1166:敌兵布阵
敌兵布阵
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 121643 Accepted Submission(s): 50879
中央情报局要研究敌人究竟演习什么战术,所以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
#include <bits/stdc++.h>
using namespace std;
const int N=+;
int t, n, p = ;
struct segTree{
int l, r;
int v;
}T[N*]; void Build(int l, int r, int k){
T[k].l = l, T[k].r = r;
if(l == r){
scanf("%d", &T[k].v);
return;
}
int mid = (l+r)/;
Build(l, mid, k*);
Build(mid+, r, k*+);
T[k].v = T[k*].v + T[k*+].v;
} void Update(int c, int v, int k){
if(T[k].l == T[k].r && T[k].l == c){
T[k].v += v;
return;
}
int mid = (T[k].l+T[k].r)/;
if(c <= mid) Update(c, v, k*);
else Update(c, v, k*+);
T[k].v = T[k*].v + T[k*+].v;
} int ans;
void Query(int l, int r, int k){
if(l > T[k].r || r < T[k].l){
return;
}
if(l <= T[k].l && r >= T[k].r){
ans += T[k].v;
return;
}
int mid = (T[k].l+T[k].r)/;
if(r < mid) Query(l, r, k*);
else if(l > mid) Query(l, r, k*+);
else{
Query(l, mid, k*);
Query(mid+, r, k*+);
}
} int main(){
scanf("%d", &t);
while(t--){
scanf("%d", &n);
Build(, n, );
char op[];
printf("Case %d:\n", ++p);
while(scanf("%s", op), op[] != 'E'){
int u, v;
scanf("%d%d", &u, &v);
if(op[] == 'A'){
Update(u, v, );
}
else if(op[] == 'S'){
Update(u, -v, );
}
else{
ans = ;
Query(u, v, );
printf("%d\n", ans);
}
}
}
}
树状数组ac代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#define N 50005
using namespace std; int a[N],n;
int lowbit(int x)
{
return x&(-x);
}
void Insert(int i,int x)
{
while(i<=n)
{
a[i]+=x;
i+=lowbit(i);
}
}
int getSum(int i)
{
int sum=;
while(i>)
{
sum+=a[i];
i-=lowbit(i);
}
return sum;
}
int main()
{
char s[];
int t,Case=,m,b;
cin>>t;
while(t--)
{
cin>>n;
memset(a,,sizeof(a));
for(int i=;i<=n;i++)
{
int n;
cin>>n;
Insert(i,n);
}
printf("Case %d:\n",Case++);
while(scanf("%s",s),strcmp(s,"End"))
{ if(s[]=='A')
{
cin>>m>>b;
Insert(m,b);
}
else if(s[]=='S')
{
cin>>m>>b;
Insert(m,-b);
}
else if(s[]=='Q')
{
cin>>m>>b;
cout<<getSum(b)-getSum(m-)<<endl;
}
else
break;
}
}
return ;
}
线段树模板hdu 1166:敌兵布阵的更多相关文章
- 线段树模板 hdu 1166 敌兵布阵
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- 【线段树】HDU 1166 敌兵布阵
这道题目是线段树里面最基础的单点更新问题. 设计的知识点包括线段树的单点更新和区间查询. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 G++ ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- 【线段树I:母题】hdu 1166 敌兵布阵
[线段树I:母题]hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 题目大意 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又開始忙乎了.A国在海 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166.敌兵布阵-完全版线段树(单点增减、区间求和)
生活艰辛,且行且珍惜. 先水一篇博客再去补题,要不然又忘记写博客了. 计划系统的刷一遍线段树专题,自己给自己找虐(自作孽不可活),从基础的到后面的,所有的都挂了题,刷题不,大兄弟? 线段树可真有意思, ...
- HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)
HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和) 点我挑战题目 题意分析 根据数据范围和询问次数的规模,应该不难看出是个数据结构题目,题目比较裸.题中包括以下命令: 1.Add(i ...
- hdu 1166敌兵布阵(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) M ...
- HDU 1166 敌兵布阵 (树状数组)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- cuda by example【读书笔记1】
cuda 1. 以前用OpenGL和DirectX API简介操作GPU,必须了解图形学的知识,直接操作GPU要考虑并发,原子操作等等,cuda架构为此专门设计.满足浮点运算,用裁剪后的指令集执行通用 ...
- [LeetCode] Best Time to Buy and Sell Stock 6道合集【DP】
1. Best Time to Buy and Sell Stock 2. Best Time to Buy and Sell Stock II 3. Best Time to Buy and Sel ...
- zTree的使用教程
1.首先去官网下载http://www.ztree.me/v3/main.php#_zTreeInfo 2.之后引入: <script src="js/jquery.ztree.all ...
- Python_函数_参数
def 是函数的关键字,Python解释器一旦执行到def,默认不执行 def li(): n = 8 n +=1 print(n) li() li2 = li li2() 结果: 9 9 ret ...
- 实际生产用法CMS和G1
java -Xms100m -Xmx100m -Xmn50m -XX:MetaspaceSize=20m -XX:MaxMetaspaceSize=20m -XX:+UseConcMarkSweepG ...
- parted 分区命令
fdisk 是针对 MBR的分区 ,因为MBR分区空间最大不能超过2T 最多分4个主分区 , 所以parted可以修改磁盘为GPT 可以支持更大的分区,更多的分区 1 查看分区 : #part ...
- python模块安装查看、包制作
一. 模块安装 ubuntu : apt-get install python-pip redhat: yum install python-pip pip install 模块 pip instal ...
- 2018牛客网暑假ACM多校训练赛(第八场)H Playing games 博弈 FWT
原文链接https://www.cnblogs.com/zhouzhendong/p/NowCoder-2018-Summer-Round8-H.html 题目传送门 - https://www.no ...
- python面试题之python下多线程的限制
python多线程有个全局解释器锁(global interpreter lock). 这个锁的意思是任一时间只能有一个线程使用解释器,跟单cpu跑多个程序一个意思,大家都是轮着用的,这叫“并发”,不 ...
- 043 hive数据同步到mysql
一:意义 1.意义 如果可以实现这个功能,就可以使用spark代替sqoop,功能程序就实现这个功能. 二:hive操作 1.准备数据 启动hive 否则报错,因为在hive与spark集成的时候,配 ...