博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【线段树成段更新成段查询模板】【POJ3468】A Simple Problem with Integerst
阅读量:6227 次
发布时间:2019-06-21

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

题目大意:

2个操作

A.区间a b 增加 c

B 查询a b;

注意事项:1.记住要清除标记

                2.查询时要下放标记,但没必要向上更新

线段:自带的,不用建模

区间和性质:sum;

 
/*WA 1次 以为不要LONG LONG*/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define oo 0x13131313#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define LL long longconst int maxn=100000+5;using namespace std;int N,Q;LL tree[maxn*4];LL col[maxn*4];void PushUp(int rt){ tree[rt]=tree[rt<<1]+tree[rt<<1|1];}int build(int l,int r,int rt){ col[rt]=0; if(l==r){scanf("%lld",&tree[rt]);return 0;} int m=(l+r)>>1; build(lson); build(rson); PushUp(rt);}void Pushdown(int rt,int k) //k是长度{ if(col[rt]) { col[rt<<1]+=col[rt]; col[rt<<1|1]+=col[rt]; tree[rt<<1]+=(k-(k>>1))*col[rt]; tree[rt<<1|1]+=(k>>1)*col[rt]; col[rt]=0; }}int update(int L,int R,int c,int l,int r,int rt) { if (L<=l&&r<= R) { col[rt]+=c; //不同题目处理方式不同 , tree[rt]+=(LL)c*(r-l+1); return 0; } Pushdown(rt,r-l+1); //Lazy 下放 int m=(l+r)>>1; //下面与以往一样 if (L<=m) update(L,R,c,lson); if (R>m) update(L,R,c,rson); PushUp(rt);}LL query(int L,int R,int l,int r,int rt){ LL temp=0; if(L<=l&&r<=R){return tree[rt];} Pushdown(rt,r-l+1); int m=(l+r)>>1; if(L<=m) temp+=query(L,R,lson); if(R>m) temp+=query(L,R,rson); return temp;}void solve(){ char temp; int a,b,c; getchar(); for(int i=1;i<=Q;i++) { scanf("%c",&temp); if(temp=='Q') { scanf("%d%d",&a,&b); printf("%lld\n",query(a,b,1,N,1)); } else if(temp=='C') { scanf("%d%d%d",&a,&b,&c); update(a,b,c,1,N,1); } getchar(); }}void init(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout);}int main(){ // init(); while(cin>>N>>Q) { build(1,N,1); solve(); } return 0;}
全long long 形式

/*WA 1次 以为不要LONG LONGWA 2次 全LONG LONG为妙WA 3次 m 忘记改成long long 了*/#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define oo 0x13131313#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define LL long longconst int maxn=100000+5;using namespace std;int N,Q;LL tree[maxn*4];LL col[maxn*4];void PushUp(int rt){ tree[rt]=tree[rt<<1]+tree[rt<<1|1];}int build(LL l,LL r,int rt){ col[rt]=0; if(l==r){scanf("%lld",&tree[rt]);return 0;} LL m=(l+r)>>1; build(lson); build(rson); PushUp(rt);}void Pushdown(int rt,LL k) //k是长度{ if(col[rt]) { col[rt<<1]+=col[rt]; col[rt<<1|1]+=col[rt]; tree[rt<<1]+=(k-(k>>1))*col[rt]; tree[rt<<1|1]+=(k>>1)*col[rt]; col[rt]=0; }}int update(int L,int R,LL c,LL l,LL r,int rt) { if (L<=l&&r<= R) { col[rt]+=c; //不同题目处理方式不同 , tree[rt]+=c*(r-l+1); return 0; } Pushdown(rt,r-l+1); //Lazy 下放 LL m=(l+r)>>1; //下面与以往一样 if (L<=m) update(L,R,c,lson); if (R>m) update(L,R,c,rson); PushUp(rt);}LL query(int L,int R,LL l,LL r,int rt){ LL temp=0; if(L<=l&&r<=R){return tree[rt];} Pushdown(rt,r-l+1); LL m=(l+r)>>1; if(L<=m) temp+=query(L,R,lson); if(R>m) temp+=query(L,R,rson); return temp;}void solve(){ char temp; LL a,b; LL c; getchar(); for(int i=1;i<=Q;i++) { scanf("%c",&temp); if(temp=='Q') { scanf("%lld%lld",&a,&b); printf("%d\n",query(a,b,1,N,1)); } else if(temp=='C') { scanf("%lld%lld%lld",&a,&b,&c); update(a,b,c,1,N,1); } getchar(); }}void init(){ freopen("a.in","r",stdin); freopen("a.out","w",stdout);}int main(){ // init(); while(cin>>N>>Q) { build(1,N,1); solve(); } return 0;}

转载于:https://www.cnblogs.com/zy691357966/p/5480379.html

你可能感兴趣的文章
调整linux的时钟
查看>>
ObjectOutputStream和ObjectInputStream
查看>>
static作用
查看>>
IT架构之IT架构标准——思维导图
查看>>
ZOJ3827 ACM-ICPC 2014 亚洲区域赛的比赛现场牡丹江I称号 Information Entropy 水的问题...
查看>>
List、Map和Set实现类
查看>>
Android Fragment 真正彻底的解决(下一个)
查看>>
zoj 3659 并检查集合
查看>>
VS2010如何调试IIS上的网站
查看>>
iPhone 6/plus iOS Safari fieldset border 边框消失
查看>>
Xms Xmx PermSize MaxPermSize 区别
查看>>
【转】预装(push)lib64中so文件查找错误
查看>>
《Python简明教程》总结
查看>>
构造 - HDU 5402 Travelling Salesman Problem
查看>>
[转]图解分布式一致性协议Paxos
查看>>
【SSH2(实用文章)】--Struts2文件上传和下载的例子
查看>>
Rust初步(七):格式化
查看>>
微服务架构的设计模式
查看>>
【C++】继承时构造函数和析构函数
查看>>
python风味之大杂烩
查看>>