题意:在序列中修改单点和查询区间和

#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 敌兵布阵 [线段树模板]相关推荐

  1. hdu1166 敌兵布阵 线段树

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

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

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

  3. HDU1166 敌兵布阵【树状数组】

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

  4. HDU1166 敌兵布阵(树状数组模板题)

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

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

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

  6. 敌兵布阵 线段树

    敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description Li ...

  7. Hud 敌兵布阵 --线段树的插点问线

    每个树存放的事左右端点的的总和,然后再递归往下分成更小的区间,根据着2*t是下一层节点的节点端点是(left,left+right)/2);2*t+1是右节点的区间是(left+right)/2+1, ...

  8. hdu-1166敌兵布阵(树状数组)

    此处的树状数组讲解请点击:here~~~ #include<stdio.h> #include<string.h> int n,a[50005],q[40005]; int l ...

  9. A - 敌兵布阵(线段树模版题)

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

最新文章

  1. 【AAAI2022】多任务推荐中的跨任务知识提炼
  2. 分享Kali Linux 2016.2第48周虚拟机
  3. 硅谷“封城”前夜的L4级别无人车试乘实况,及其背后创新技术的深度剖析
  4. 共享寒冬中的常青树,2 次获得阿里投资的衣二三“欲隐藏”的数据真相 | 深度案例...
  5. 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
  6. nginx ngx_http_mirror_module模块
  7. Centos/Red Hat7/8.x 安装、配置、启动Gitlab14.x (语言和主题配置)
  8. python中import的作用_python使用import报错是什么原因
  9. ubuntu系统安装百度云盘
  10. expandable长点击的实现
  11. 静态HTML网页设计作品:旅游网站设计——开心旅游网(15页) HTML+CSS+JavaScript 主题度假酒店
  12. Activity的基本理解
  13. 测试公总号加入微信开放平台
  14. 移动硬盘位置不可用的数据恢复方法
  15. 大数据千亿级离线数仓项目第一天 环境部署和etl
  16. cocosCreator日历插件
  17. 安卓 Bitmap 高效加载
  18. java ee学生信息管理_基于jsp的学籍学生信息信息管理系统-JavaEE实现学籍学生信息信息管理系统 - java项目源码...
  19. 黄聪:Windows7立体声混音设置方法(stereo mix)(转)
  20. 数据集(casia,msu,replay,oulu)的详细信息

热门文章

  1. C实现的一个简单的学生成绩管理系统
  2. 为服务器端控件添加js.net
  3. Java拆分字符串的函数——split
  4. 青年歌手大奖赛_评委会打分
  5. OpenGL浮雕效果
  6. idea包名呈现层级显示
  7. C语言再学习--关键字
  8. STM32开发 -- 惯导模块开发详解
  9. Android系统中的进程管理:进程的优先级
  10. 探秘身份认证利器——声纹识别!