博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3468(线段树)
阅读量:5965 次
发布时间:2019-06-19

本文共 1708 字,大约阅读时间需要 5 分钟。

 

题目连接:

线段树功能:update:成段增减 query:区间求和。

分析:需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候。

 

#include
#include
#include
#include
#define LL long long#define M 1000000000#define maxn 111111#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;LL sum[maxn<<2];LL col[maxn<<2];void Pushup(int rt){ sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void Pushdown(int rt,int m){ if(col[rt]) { col[rt<<1]+=col[rt]; col[rt<<1|1]+=col[rt]; sum[rt<<1]+=col[rt]*(m-(m>>1)); sum[rt<<1|1]+=col[rt]*(m>>1); col[rt]=0; }}void build(int l,int r,int rt){ col[rt]=0; if(l==r) { scanf("%lld",&sum[rt]); return; } int m=(l+r)>>1; build(lson); build(rson); Pushup(rt);}void update(int L,int R,int c,int l,int r,int rt){ if(L<=l&&r<=R) { col[rt]+=c; sum[rt]+=(LL)(r-l+1)*c; return; } Pushdown(rt,r-l+1); int m=(l+r)>>1; if(L<=m)update(L,R,c,lson); if(m
>1; LL res=0; if(L<=m)res+=query(L,R,lson); if(R>m)res+=query(L,R,rson); return res;}int main(){ int n,m; char op[10]; while(scanf("%d%d",&n,&m)>0) { build(1,n,1); while(m--) { int a,b,c; scanf("%s",op); if(op[0]=='Q') { scanf("%d%d",&a,&b); printf("%lld\n",query(a,b,1,n,1)); } else { scanf("%d%d%d",&a,&b,&c); update(a,b,c,1,n,1); } } } return 0;}
View Code

 

转载于:https://www.cnblogs.com/lienus/p/4240250.html

你可能感兴趣的文章
我的友情链接
查看>>
linux 系统调优步骤 例
查看>>
显式方法与隐式方法
查看>>
Android防火墙+流量统计代码
查看>>
通知中心
查看>>
我的友情链接
查看>>
MVC中的三个模块
查看>>
Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
查看>>
oracle 常用命令大汇总
查看>>
2012年春运火车票电话和网上订票技巧、攻略
查看>>
根据request获取请求路径
查看>>
mysql 并行复制
查看>>
傲不可长,欲不可纵,乐不可极,志不可满——提高个人修养
查看>>
linux系统增加swap容量的方法
查看>>
后台调用gps
查看>>
HTML5标签的语义认知和理解(1)
查看>>
MySQL日志功能详解(2)
查看>>
HP LaserJet 305X 和 339X 系列一体机如何设置手动或自动接收传真?
查看>>
linux之权限之隐藏权限
查看>>
XDCTF成长记录
查看>>