HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵
单点更新和区间更新还是有一些区别的,应该注意!
【题目链接】敌兵布阵
【题目类型】线段树单点更新
&题意:
第一行一个整数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条命令
&题解:
线段树 单点更新模板题
【时间复杂度】\(O(nlogn)\)
&代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define lsn b,m,rt<<1
#define rsn m+1,e,rt<<1|1
const int maxn=50000+9;
int seg[maxn<<2];
int a[maxn];
inline void PushUp(int rt)
{
//注意这: 一定是= 不是+= 因为在updata时 +=会错
seg[rt]=seg[rt<<1]+seg[rt<<1|1];
// seg[rt]+=seg[rt<<1]+seg[rt<<1|1]; 错的
}
void Build(int b,int e,int rt)
{
seg[rt]=0;
if (b==e){
seg[rt]=a[b];
return;
}
int m=b+e>>1;
Build(lsn);
Build(rsn);
PushUp(rt);
}
void Updata(int idx,int xx,int b,int e,int rt)
{
if (b==e){
seg[rt]+=xx;
return ;
}
int m=b+e>>1;
//这不用再像区间一样弄了 因为只有1个位置 所以if else就够了 不用if + if 了
if (idx<=m)
Updata(idx,xx,lsn);
else
Updata(idx,xx,rsn);
PushUp(rt);
}
int Query(int l,int r,int b,int e,int rt)
{
if (l<=b&&e<=r){
return seg[rt];
}
int m=b+e>>1;
int ans=0;
if (l<=m)
ans+=Query(l,r,lsn);
if (m<r)
ans+=Query(l,r,rsn);
return ans;
}
int K;
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
Build(1,n,1);
printf("Case %d:\n",++K);
char op[33];
int u,v;
while(1){
scanf("%s",op);
if (op[0]=='E') break;
scanf("%d%d",&u,&v);
if (op[0]=='A')
Updata(u,v,1,n,1);
if (op[0]=='S')
Updata(u,-v,1,n,1);
if (op[0]=='Q')
printf("%d\n",Query(u,v,1,n,1));
}
}
return 0;
}
HDU 1166 敌兵布阵(线段树单点更新)的更多相关文章
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(线段树单点更新,区间查询)
描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...
- HDU 1166 敌兵布阵 线段树单点更新求和
题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmat ...
- 【原创】hdu 1166 敌兵布阵(线段树→单点更新,区间查询)
学习线段树的第三天...真的是没学点啥好的,又是一道水题,纯模板,我个人觉得我的线段树模板还是不错的(毕竟我第一天相当于啥都没学...找了一整天模板,对比了好几个,终于找到了自己喜欢的类型),中文题目 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题
题目链接:敌兵布阵 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视 ...
随机推荐
- MySQL的左连接、右连接和全连接的实现
表student:+----+-----------+------+| id | name | age |+----+-----------+------+| 1 | Jim | 18 || 2 | ...
- 音乐播放(AVAudioPlayer)
- Hibernate 开发流程
Hibernate内部分装的技术:JDBC(Java Data Base Connectivity), JTA(Java Transaction API) , JNDI(Java Naming and ...
- javascript原始数据类型compareto引用数据类型--近3天不太会的地方
ECMAScirpt 变量有两种不同的数据类型:基本类型,引用类型.也有其他的叫法,比如原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,还可以分为可变类型和不可变类型,其实这些叫法都是依据这两 ...
- python 中*args 和 **kwargs
简单的可以理解为python 中给函数传递的可变参数,args 是 列表的形式.kwargs 是 key,value的形式,也就是python 中的字典. *args 必须出现在**kwargs 的前 ...
- 【转】使用Eclipse搭建Python开发环境
因为要进行自动化测试,所以要搭建Python开发环境.这里将使用Eclipse+pyDev进行搭建,在此作为笔记记录下来. 需要的组件: 1.Eclipse SDK 3.7(这里将不再叙述Eclips ...
- 初学JAVA 感想
开始学习任何一门课(包括java),兴趣最重要.一直觉得自己在学计算机编程语言,学习了很多,但每门语言都停留在知识边缘地带,都没深入到它们的精华部分,对它们的精华部分知之甚少,于是趁学校开设这门课,并 ...
- CentOS6.5上Oracle11gR2静默安装
一.环境准备环境 操作系统:CentOS release 6.5 (Final) 内核版本:2.6.32-431.el6.x86_64 物理内存:2G(必须大于1G) swap分区:3G(必须大于3G ...
- 11.14 T2 小x的旅行(小x的旅行)
1.小x的旅行 (travel.pas/c/cpp) [问题描述] 小x大学毕业后,进入了某个公司做了高层管理,他每年的任务就是检查这个公司在全国各地N个分公司的各种状况,每个公司都要检查一遍,且 ...
- 单例模式读取properties配置文件中的信息
public class ConfigManager { private static ConfigManager config = null; //创建Properties文件 读取配 ...