博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)
阅读量:7262 次
发布时间:2019-06-29

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

【题意】给定序列,支持区间加和区间乘,查询区间和取模。n<=10^5。

【算法】线段树

【题解】线段树多重标记要考虑标记与标记之间的相互影响。

对于sum*b+a,+c直接加上即可。

*c后就是(sum*b+a)*c=sum*b*b+a*c,也就是加法的部分也要乘。

所以,每次在乘法的时候要把加法标记也乘上。下传时先传乘法。

注意乘法初始值为1,但是取模后可能为0。

#include
#include
#include
#include
using namespace std;int read(){ int s=0,t=1;char c; while(!isdigit(c=getchar()))if(c=='-')t=-1; do{s=s*10+c-'0';}while(isdigit(c=getchar())); return s*t;}const int maxn=100010;struct tree{
int l,r,a,b,sum;}t[maxn*4];int n,MOD,a[maxn];int M(int x){
return x>=MOD?x-MOD:x;}void up(int k){t[k].sum=M(t[k<<1].sum+t[k<<1|1].sum);}void modify_a(int k,int x){t[k].sum=M(t[k].sum+1ll*(t[k].r-t[k].l+1)*x%MOD);t[k].a=M(t[k].a+x);}//void modify_b(int k,int x){t[k].sum=1ll*t[k].sum*x%MOD;t[k].b=1ll*t[k].b*x%MOD;t[k].a=1ll*t[k].a*x%MOD;}void down(int k){ if(t[k].b!=1){
// 0 modify_b(k<<1,t[k].b);modify_b(k<<1|1,t[k].b); t[k].b=1; } if(t[k].a){ modify_a(k<<1,t[k].a);modify_a(k<<1|1,t[k].a); t[k].a=0; }}void build(int k,int l,int r){ t[k].l=l;t[k].r=r;t[k].a=0;t[k].b=1; if(l==r){t[k].sum=a[l];return;} int mid=(l+r)>>1; build(k<<1,l,mid);build(k<<1|1,mid+1,r); up(k);}void add(int k,int l,int r,int x){ if(l<=t[k].l&&t[k].r<=r){modify_a(k,x);return;} down(k); int mid=(t[k].l+t[k].r)>>1;// if(l<=mid)add(k<<1,l,r,x); if(r>mid)add(k<<1|1,l,r,x); up(k);}void mul(int k,int l,int r,int x){ if(l<=t[k].l&&t[k].r<=r){modify_b(k,x);return;} down(k); int mid=(t[k].l+t[k].r)>>1;// if(l<=mid)mul(k<<1,l,r,x); if(r>mid)mul(k<<1|1,l,r,x); up(k);}int query(int k,int l,int r){ if(l<=t[k].l&&t[k].r<=r){
return t[k].sum;} down(k); int mid=(t[k].l+t[k].r)>>1,sum=0; if(l<=mid)sum=query(k<<1,l,r); if(r>mid)sum=M(sum+query(k<<1|1,l,r)); return sum;}int main(){ n=read();MOD=read(); for(int i=1;i<=n;i++)a[i]=read()%MOD; build(1,1,n); int m=read(); while(m--){ int k=read(),x=read(),y=read(); if(k==3){printf("%d\n",query(1,x,y));continue;} int z=read(); if(k==1)mul(1,x,y,z%MOD);else add(1,x,y,z%MOD); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/8493338.html

你可能感兴趣的文章
Juvo——你的私人睡眠管家!
查看>>
LibreOffice 6.2.2 发布,功能强大的开源办公套件
查看>>
我国最大电子信息博览会——第14届上海国际信息化博览会开幕
查看>>
量子非定域性与猫王之死
查看>>
API决赛作品-皮肤癌手术安全切缘计算参赛总结
查看>>
亿方云成企业服务潜力新星 云市场生态持续发酵
查看>>
文件管理框架,可实现后台编辑项目文件
查看>>
在docker中部署静态网页
查看>>
Qlik被评为《 Fast Company 》“社会公益领域十大最具创新性公司”
查看>>
量子计算技术的现状、流派、挑战与前景
查看>>
BTA | 张犁 :为什么需要一个通用区块链资产平台?
查看>>
易点租首家提出免押金租赁 帮助企业轻资产运营
查看>>
转-基于NodeJS的14款Web框架
查看>>
Disney牵手联想发布AR头显,还有配备激光剑的AR游戏《星球大战》
查看>>
刘晓红:解码慧聪芯城怎么做电子产业B2B3.0
查看>>
h.264的POC计算
查看>>
时间序列数据的处理
查看>>
CSO vs. CISO 一篇文章了解首席安全官
查看>>
一加终于承认擅自收集用户隐私的行为,但声称从未提供给第三方
查看>>
恋恋风辰 对于redis底层框架的理解(一)
查看>>