HDU1166 敌兵布阵 [线段树模板]
题意:在序列中修改单点和查询区间和
#include<iostream> #include<cstdio> #include<cstring> #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 using namespace std; const int maxn=50005*4; int sum[maxn<<2],add[maxn<<2];//sum求和,add懒惰标记 int a[maxn]={0},n=50005;//存原数组数据下标[1,n] //更新节点信息,这里是求和 void pushup(int rt) {sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } //建树 void pushdown(int rt,int ln,int rn) {//ln,rn为左子树,右子树的数量if(add[rt])//下推标记 {add[rt<<1]+=add[rt];add[rt<<1|1]+=add[rt];sum[rt<<1]+=add[rt]*ln;sum[rt<<1|1]+=add[rt]*rn;add[rt]=0;//清除本节点标记 } } void build(int l,int r,int rt)//rt表示当前节点编号 {if(l==r){sum[rt]=a[l];return;}int m=(l+r)>>1;build(l,m,rt<<1);build(m+1,r,rt<<1|1);pushup(rt); }//点修改a[L]+=c; //比如update(a,-b,1,n,1);//修改a点的值,减去b,当前节点区间是1到n,起始点是1 void update(int L,int c,int l,int r,int rt) {//l,r当前节点区间,rt当前节点编号,L需要修改的节点,c修改的值if(l==r){sum[rt]+=c;return;}int m=(l+r)>>1;//根据条件判断调用左子树还是右子树if(L<=m)update(L,c,l,m,rt<<1);elseupdate(L,c,m+1,r,rt<<1|1);pushup(rt);//子节点更新,所以本节点也需要更新 }//区间修改a[r,t]+=c ////比如query(a,b,1,n,1))查询a b之间的和,当前节点区间是1到n,起始点是1 void update_(int L,int R,int c,int l,int r,int rt) {//L,R表示操作区间,l,r表示当前节点区间,rt表示当前节点编号if(L<=l&&r<=R)//遍历的区间在操作区间内 {sum[rt]+=c*(r-l+1);add[rt]+=c;return;}int m=(l+r)>>1;pushdown(rt,m-l+1,r-m);if(L<=m)update_(L,R,c,l,m,rt<<1);if(R>m)update_(L,R,c,m+1,r,rt<<1|1);pushup(rt); } //区间查询 a[l,r]的和 //下推标记函数int query(int L,int R,int l,int r,int rt) {if(L<=l&&r<=R){return sum[rt];}int m=(l+r)>>1;pushdown(rt,m-l+1,r-m);int ans=0;if(L<=m)ans+=query(L,R,l,m,rt<<1);if(R>m)ans+=query(L,R,m+1,r,rt<<1|1);return ans; }int main() {int t,cnt=1;scanf("%d",&t);while(t--){memset(a,0,sizeof(a));memset(sum,0,sizeof(sum));memset(add,0,sizeof(add));scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);build(1,n,1);printf("Case %d:\n",cnt++);char str[20];while(scanf("%s",str)&&str[0]!='E'){int a,b;scanf("%d%d",&a,&b);if(str[0]=='Q'){query(a,b,1,n,1);}if(str[0]=='S')update(a,-b,1,n,1);//修改a点的值,减去b,当前节点区间是1到n,起始点是1if(str[0]=='A')update(a,b,1,n,1);if(str[0]=='Q')printf("%d\n",query(a,b,1,n,1));//查询a b之间的和,当前节点区间是1到n,起始点是1 }}return 0; }
转载于:https://www.cnblogs.com/fudanxi/p/11172549.html
HDU1166 敌兵布阵 [线段树模板]相关推荐
- hdu1166 敌兵布阵 线段树
C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于 ...
- HDU 1166 敌兵布阵(线段树:点更新,区间求和)
HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...
- 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 Submi ...
- hdu 1166 敌兵布阵 (线段树)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 敌兵布阵 线段树
敌兵布阵 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description Li ...
- Hud 敌兵布阵 --线段树的插点问线
每个树存放的事左右端点的的总和,然后再递归往下分成更小的区间,根据着2*t是下一层节点的节点端点是(left,left+right)/2);2*t+1是右节点的区间是(left+right)/2+1, ...
- hdu-1166敌兵布阵(树状数组)
此处的树状数组讲解请点击:here~~~ #include<stdio.h> #include<string.h> int n,a[50005],q[40005]; int l ...
- A - 敌兵布阵(线段树模版题)
传送门 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情 ...
最新文章
- 【AAAI2022】多任务推荐中的跨任务知识提炼
- 分享Kali Linux 2016.2第48周虚拟机
- 硅谷“封城”前夜的L4级别无人车试乘实况,及其背后创新技术的深度剖析
- 共享寒冬中的常青树,2 次获得阿里投资的衣二三“欲隐藏”的数据真相 | 深度案例...
- 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
- nginx ngx_http_mirror_module模块
- Centos/Red Hat7/8.x 安装、配置、启动Gitlab14.x (语言和主题配置)
- python中import的作用_python使用import报错是什么原因
- ubuntu系统安装百度云盘
- expandable长点击的实现
- 静态HTML网页设计作品:旅游网站设计——开心旅游网(15页) HTML+CSS+JavaScript 主题度假酒店
- Activity的基本理解
- 测试公总号加入微信开放平台
- 移动硬盘位置不可用的数据恢复方法
- 大数据千亿级离线数仓项目第一天 环境部署和etl
- cocosCreator日历插件
- 安卓 Bitmap 高效加载
- java ee学生信息管理_基于jsp的学籍学生信息信息管理系统-JavaEE实现学籍学生信息信息管理系统 - java项目源码...
- 黄聪:Windows7立体声混音设置方法(stereo mix)(转)
- 数据集(casia,msu,replay,oulu)的详细信息