hdu 1166 敌兵布阵(基本操作)

有三种操作:询问区间总和,增加某个兵营的兵的数目,减少某个兵营的兵的数目。实际上也只有两个。

在更新的时候,每到一个区间就把当前区间的sum增加对应的数目,到达叶子结点是返回。这样就可以不会回溯去更新父亲结点的值。查询的时候,如果区间完全匹配,直接返回区间的sum值,否则向下寻找,直到完全匹配,然后返回它们的和就可以。这时候,结果里保存的边界是它们真正的边界。

/*更新了代码风格后*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define MID(a,b) (a+((b-a)>>1))
const int N=50005;struct node
{int lft,rht;int sum;int mid(){return MID(lft,rht);}
};int y[N],n;struct Segtree
{node tree[N*4];void build(int lft,int rht,int ind){tree[ind].lft=lft; tree[ind].rht=rht;tree[ind].sum=0;if(lft==rht) tree[ind].sum=y[lft];else {int mid=tree[ind].mid();build(lft,mid,LL(ind));build(mid+1,rht,RR(ind));tree[ind].sum=tree[LL(ind)].sum+tree[RR(ind)].sum;}}void updata(int pos,int ind,int valu){if(tree[ind].lft==tree[ind].rht) tree[ind].sum+=valu;else {int mid=tree[ind].mid();if(pos<=mid) updata(pos,LL(ind),valu);else updata(pos,RR(ind),valu);tree[ind].sum=tree[LL(ind)].sum+tree[RR(ind)].sum;}}int query(int st,int ed,int ind){int lft=tree[ind].lft,rht=tree[ind].rht;if(st<=lft&&rht<=ed) return tree[ind].sum;else {int mid=tree[ind].mid();int sum1=0,sum2=0;if(st<=mid) sum1=query(st,ed,LL(ind));if(ed>mid) sum2=query(st,ed,RR(ind));return sum1+sum2;}}
}seg;
int main()
{int t,t_cnt=0;scanf("%d",&t);while(t--){int a,b;char str[10];scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&y[i]);seg.build(1,n,1);printf("Case %d:\n",++t_cnt);while(1){scanf("%s",str);if(strcmp(str,"End")==0) break;scanf("%d%d",&a,&b);if(strcmp(str,"Add")==0) seg.updata(a,1,b);else if(strcmp(str,"Sub")==0) seg.updata(a,1,-b);else printf("%d\n",seg.query(a,b,1));}}return 0;
}
/*代码风格更新前*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1000005;
int a[N];
struct node
{int left,right,sum;int mid(){ return left+(right-left)/2;}
};
struct Segtree
{node tree[N*4];void build(int left,int right,int p){tree[p].left=left;tree[p].right=right;tree[p].sum=0;if(left<right){int mid=tree[p].mid();build(left,mid,p*2);build(mid+1,right,p*2+1);}else if(left==right){tree[p].sum=a[left];return;}tree[p].sum=tree[p*2].sum+tree[p*2+1].sum;}void updata(int pos,int p,int data){tree[p].sum+=data;int mid=tree[p].mid();if(tree[p].left==pos&&tree[p].right==pos) return;else if(pos<=mid) updata(pos,p*2,data);else if(pos>mid) updata(pos,p*2+1,data);}int query(int be,int end,int p){int left=tree[p].left;int right=tree[p].right;if(be<=left&&right<=end){return tree[p].sum;}else{int sum1=0,sum2=0;int mid=tree[p].mid();if(be<=mid) sum1=query(be,end,p*2);if(end>mid) sum2=query(be,end,p*2+1);return sum1+sum2;}}
}seg;
int main()
{int t,t_cnt=0;scanf("%d",&t);while(t--){int n,x,y;char temp[10];scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);printf("Case %d:\n",++t_cnt);seg.build(1,n,1);while(scanf("%s",temp)!=EOF){if(strcmp(temp,"End")==0) break;else if(strcmp(temp,"Add")==0){scanf("%d%d",&x,&y);seg.updata(x,1,y);}else if(strcmp(temp,"Sub")==0){scanf("%d%d",&x,&y);seg.updata(x,1,-y);}else if(strcmp(temp,"Query")==0){scanf("%d%d",&x,&y);printf("%d\n",seg.query(x,y,1));}}}return 0;
}

hdu 1166 敌兵布阵(单点更新)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. HDU 1166 敌兵布阵

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

  7. HDU1166 敌兵布阵 单点更新 区间查询

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

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

    敌兵布阵 日常题目胡乱总结 是个裸的树状数组qwq 区间查询+单点修改 字符判断相等那个地方我开始用的单引号 '  ' 直接不通过编译QAQ 第一遍交没有在一组数据结束后清空c数组 WA的让我很懵逼 ...

  9. 线段树版子题【HDU - 1166 敌兵布阵】【HDU-1754 I Hate It】【HDU-1698 Just a Hook】【OpenJ_Bailian3439A Simple Pro】

    敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动 ...

最新文章

  1. 如何使用Leangoo看板统计中的任务分布?
  2. 二、神兽变变变(上)
  3. 捉虫记 单步跟踪 条件断点 变量查看实践
  4. 【SQL进阶】03.执行计划之旅1 - 初探
  5. Anaconda安装与环境配置
  6. 《需求工程——软件建模与分析》阅读笔记之二
  7. 【英文写作日知录 第2期】句式汇总 Sun, 04 July 2021
  8. SuSE 10操作系统中设置系统时间的方法
  9. keras读取训练好的模型参数并把参数赋值给其它模型
  10. 只有一个文件的开源富文本编辑器,麻雀虽小五脏俱全就是它了
  11. 使命召唤9怎么样使用计算机,玩家实测COD9 教你如何使用FXAA、TXAA
  12. html中重叠盒子之间的距离,div间距设置_div之间距离设置布局
  13. MATLAB--微分方程
  14. java手机游戏吸血鬼_Java 吸血鬼数字
  15. audio应用-外接akm7755
  16. java 架构发展历史_Java架构发展历程与Spring简介
  17. php5漏洞汇总,ThinkPHP 5.x RCE 漏洞分析与利用总结
  18. 为什么选择软件测试? 作为测试人员,你有什么优点?
  19. pcb天线和纯铜天线_陶瓷天线和PCB天线以及IPEX天线三者间区别
  20. 访问非法内存区和内存泄漏

热门文章

  1. CImage实现图片缩放
  2. 为什么集合可以自动扩充_第14课:你真的懂集合竞价吗!?
  3. 超级有用的网站和手机app
  4. R语言使用rbern函数生成符合伯努利分布(0-1分布)的随机数、使用plot函数可视化符合伯努利分布的随机数( Bernoulli distribution)
  5. shell 中的特殊符号的含义---留着以后自己查看
  6. 前端监控与前端埋点(初探)
  7. Android Socket通讯 之 心跳消息
  8. ArcGIS Runtime SDK for Android 100使用比例尺、指北针、书签
  9. Windows下使用C语言创建定时器并周期和网络调试助手通信
  10. 百度二次上市,其中一位敲钟人只有12岁