bzoj 1798 段乘段加线段树 双懒标记
来源:互联网 发布:淘宝卖的dnf辅助 编辑:程序博客网 时间:2024/05/18 06:53
要求的值时刻保持正确
懒标记为子节点所需的操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1798
#include<iostream>#include<algorithm>#include<iostream>#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>#include<queue>#include<cmath>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define maxNode 100010ll n,p,m;ll a[maxNode];struct node{ll l,r;ll sum;//求和值时刻保持正确ll jia,cheng;//标记都是对本点已经进行了标记ll mid(){return (l+r)>>1;}}tree[4*maxNode];void pushdown(ll id){if(tree[id].cheng!=1 || tree[id].jia!=0){tree[id<<1].cheng=tree[id<<1].cheng*tree[id].cheng%p;tree[id<<1].jia=(tree[id<<1].jia*tree[id].cheng%p+tree[id].jia)%p;tree[id<<1|1].cheng=tree[id<<1|1].cheng*tree[id].cheng%p;tree[id<<1|1].jia=(tree[id<<1|1].jia*tree[id].cheng%p+tree[id].jia)%p;ll x=tree[id].l;ll y=tree[id].r;ll mid=tree[id].mid();tree[id<<1].sum=(tree[id<<1].sum*tree[id].cheng%p+tree[id].jia*(mid-x+1)%p)%p;tree[id<<1|1].sum=(tree[id<<1|1].sum*tree[id].cheng%p+tree[id].jia*(y-mid)%p)%p;tree[id].cheng=1;tree[id].jia=0;}}void pushup(ll id){tree[id].sum=(tree[id<<1].sum+tree[id<<1|1].sum)%p;}void build(ll id,ll x,ll y){tree[id].l=x;tree[id].r=y;tree[id].cheng=1;tree[id].jia=0;if(x==y){tree[id].sum=a[x];return;}ll mid=(x+y)>>1;build(id<<1,x,mid);build(id<<1|1,mid+1,y);pushup(id);}void change(ll id,ll x,ll y,ll z,ll kind){if(tree[id].l==x && tree[id].r==y){if(kind==1){tree[id].cheng=tree[id].cheng*z%p;tree[id].jia=tree[id].jia*z%p;tree[id].sum=tree[id].sum*z%p;}else{tree[id].jia=(tree[id].jia+z)%p;tree[id].sum=(tree[id].sum+z*(y-x+1)%p)%p;}return ;}pushdown(id);int mid=tree[id].mid();if(y<=mid) change(id<<1,x,y,z,kind);else if(mid+1<=x) change(id<<1|1,x,y,z,kind);else{change(id<<1,x,mid,z,kind);change(id<<1|1,mid+1,y,z,kind);}pushup(id);}ll query(ll id,ll x,ll y){if(tree[id].l==x && tree[id].r==y){return tree[id].sum;}pushdown(id);int mid=tree[id].mid();if(y<=mid) return query(id<<1,x,y);else if(x>=mid+1) return query(id<<1|1,x,y);else return (query(id<<1,x,mid)+query(id<<1|1,mid+1,y))%p;}int main(){while(scanf("%lld%lld",&n,&p)!=EOF){ll i,j,k;ll ta,tb,tc,td;for(i=1;i<=n;i++)scanf("%lld",&a[i]);build(1,1,n);scanf("%lld",&m);while(m--){scanf("%lld",&ta);if(ta==3){scanf("%lld%lld",&tb,&tc);printf("%lld\n",query(1,tb,tc));}else{scanf("%lld%lld%lld",&tb,&tc,&td);change(1,tb,tc,td,ta);}}}return 0;}
0 0
- bzoj 1798 段乘段加线段树 双懒标记
- bzoj 1798 线段树 双lazy标记
- BZOJ 题目1798: [Ahoi2009]Seq 维护序列seq(双标记线段树)
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 双标记线段树
- 线段树单标记,双标记
- AHOI 2009 行星序列 BZOJ 1798 COGS 1272 线段树模板题:加、乘标记
- BZOJ 1798 [Ahoi2009] Seq 维护序列seq [线段树+多重标记下传]【数据结构】
- Bzoj 1798 [Ahoi2009]Seq 维护序列seq【线段树+多标记Lazy】
- [线段树 标记] BZOJ 3226 [Sdoi2008]校门外的区间
- [树链剖分 线段树 标记永久化] BZOJ 4515 [Sdoi2016]游戏
- 线段树_懒标记
- bzoj 1798 线段树
- BZOJ 1798 线段树
- bzoj 1798 线段树
- BZOJ 1798 线段树 双LAZY操作
- poj 3468 线段树+懒标记
- HDU 4902 双标记线段树
- HDU3397 线段树 区间合并 双标记
- DB2 HADR 性能调优及 HADR 模拟器
- 设计模式——装饰者模式
- android xml parse
- 阻塞与非阻塞
- DB2 Linux, Unix and Windows HADR Simulator use case and troubleshooting guid
- bzoj 1798 段乘段加线段树 双懒标记
- 使用keepalived 实现redis主从高可用
- App Store审核指南中文版(2014.10.11更新)
- 【基础篇系列3】java之面向对象
- java事务
- Linux系统攻略 用UUID在Fstab中挂载分区
- MySQL架构
- 大型网站的灵魂——性能
- 就是这么简单!使用Rest-assured 测试Restful Web Services