【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)
problem
- 给定一个长为n的序列,m次询问
- 每次询问有3种操作
1、一段区间全部乘一个值
2、一段区间全部加一个值
3、询问一段区间和%P
solution
不就一颗线段树么,看朕10分钟A掉。。。
30分钟过后:md我脑残了吧,连线段树都写不来了?还爆栈???
1小时过后:我靠,WA什么鬼,样例是水做的么?
2小时过后:什么垃圾题,还不让下数据。我用线段树模板题调。
3小时过后:朕今天就不信邪了!!!
线段树智障错法整理:
1、add,mul,query都要加pushdown。
2、和值有关的都开long long , query千万记得mod
3、递归的地方if是L不是l。
4、4倍空间、
5、调试:C++重载函数(参数不同可以同名),直接找个不同参数的复制过去调。
6、不行就重写!!!重写比调试快!!!!!10mins重写,1000mins调试?
codes
#include<iostream>
using namespace std;struct SegmentTree{typedef long long LL;#define maxn 500010#define lch p<<1#define rch p<<1|1struct node{LL val, addmark, mulmark;}sgt[maxn<<2];int mod;void build(int p, int l, int r){sgt[p].addmark = 0, sgt[p].mulmark = 1;if(l == r){cin>>sgt[p].val;return ;}int mid = l+r>>1;build(lch,l,mid);build(rch,mid+1,r);sgt[p].val = (sgt[lch].val+sgt[rch].val)%mod;return ;}void pushdown(int p, int l, int r){if(sgt[p].addmark==0&&sgt[p].mulmark==1)return ;//父节点标记LL t1 = sgt[p].addmark, t2 = sgt[p].mulmark;sgt[p].addmark = 0, sgt[p].mulmark = 1;//维护标记int mid = l+r>>1;sgt[lch].mulmark *= t2, sgt[lch].mulmark %= mod;sgt[rch].mulmark *= t2, sgt[rch].mulmark %= mod;sgt[lch].addmark = (sgt[lch].addmark*t2+t1)%mod;sgt[rch].addmark = (sgt[rch].addmark*t2+t1)%mod;//更新值sgt[lch].val = (sgt[lch].val*t2+t1*(mid-l+1))%mod;sgt[rch].val = (sgt[rch].val*t2+t1*(r-mid))%mod;return ;}void add(int p, int l, int r, int L, int R, LL v){if(L<=l && r<=R){sgt[p].val += (r-l+1)*v; sgt[p].val %= mod;sgt[p].addmark += v;sgt[p].addmark %= mod;return ;}pushdown(p,l,r);int mid = l+r>>1;if(L<=mid)add(lch,l,mid,L,R,v);//是L不是lif(R>mid)add(rch, mid+1, r,L,R,v);sgt[p].val = (sgt[lch].val+sgt[rch].val)%mod;}void times(int p, int l, int r, int L, int R, LL v){if(L<=l && r<=R){sgt[p].val *= v;sgt[p].val %= mod;sgt[p].mulmark *= v;sgt[p].mulmark %= mod;sgt[p].addmark *= v;sgt[p].addmark %= mod;return ;}pushdown(p,l,r);int mid = (l+r)/2;if(L<=mid)times(lch,l,mid,L,R,v);if(R>mid)times(rch,mid+1,r,L,R,v);sgt[p].val = (sgt[lch].val+sgt[rch].val)%mod;}LL query(int p, int l, int r, int L, int R){if(L<=l && r<=R)return sgt[p].val;pushdown(p,l,r);LL mid = l+r>>1, ans = 0;if(L<=mid)ans += query(lch,l,mid,L,R);if(R>mid)ans += query(rch,mid+1,r,L,R);return ans%mod;}
}sgt;int main(){int n, m, q;cin>>n>>q;sgt.mod = q;sgt.build(1,1,n);cin>>m;for(int i = 1; i <= m; i++){int op, l, r, v;cin>>op;if(op==1){cin>>l>>r>>v;sgt.times(1,1,n,l,r,v);}else if(op==2){cin>>l>>r>>v;sgt.add(1,1,n,l,r,v);}else{cin>>l>>r;cout<<(sgt.query(1,1,n,l,r))<<'\n';}}return 0;
}
【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)相关推荐
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq
二次联通门 : BZOJ 1798: [Ahoi2009]Seq 维护序列seq /*BZOJ 1798: [Ahoi2009]Seq 维护序列seq线段树主要是标记的顺序下放问题...乱搞一下就好. ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- HYSBZ - 1798 Seq 维护序列seq 线段树lazy标记
传送门 这道题属实是线段树的道比刷题,又加又乘的,当然还可能会有乘除,阶乘等等可能的情况. 对于这道题,主要的一个就是怎么记录lazy标记,首先的话一个数组是肯定不行的,设乘的为lazy,加的为add ...
- [Ahoi2009]Seq 维护序列seq
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
- 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq(线段树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好 ...
- BZOJ1798 【AHOI2009】 seq维护序列 线段树
维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把 ...
- 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题
题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- 线段树模板题3:区间染色问题
1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...
最新文章
- Altium Designer飞线(未连接线)不显示的解决方法
- 高级C语言教程编码风格
- Angular ng-content元素的学习笔记
- 单例模式---设计模式
- thinkphp仿百度文库网站源码
- oracle 的 父子关系,oracle父子关系树递归排序要注意什么?
- idea项目能放入eclipse_IDEA导入eclipse项目并且部署到tomcat的步骤详解
- Python图像的基本操作
- 【优化算法】寄生-捕食算法(PPA)【含Matlab源码 1801期】
- hdfs命令_HDFS命令
- 基于51单片机的双机通信系统设计protues仿真
- sqlite3数据库函数
- php+redis+保存多个值,php向redis list一次性lPush多个值
- maven-resources-plugin:2.6:resources (default-resources)
- 论文查重算法 python_个人项目之论文查重
- ORA-20011: Approximate NDV failed: ORA-00600: internal error code, arguments
- 包装严重的 IT 圈,作为面试官,是如何甄别应聘者呢?
- August Rush
- 电脑bluescreen蓝屏解决方法
- pandas合并excel
热门文章
- 计算机的组成 —— 显卡
- 重复抽样与非重复抽样
- Matlab Tricks(十)—— padarray 的实现
- 图论(一)—— 基本概念
- 用 scipy.weave 嵌入 C 语言
- scanf 在uefi中调用_BIOS、UEFI、Boot Loader都是些什么
- 小米5s升级Android8,小米5s、小米5s Plus升级8.0提前,好消息!
- python里w_python vs pythonw | 学步园
- python不会英语不会数学怎么自学-文科女生学Python:学过初中数学和英语就能懂的编程逻辑...
- python必背入门代码-python必背内容有哪些