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(线段树模板,易错提醒)相关推荐

  1. BZOJ 1798: [Ahoi2009]Seq 维护序列seq

    二次联通门 : BZOJ 1798: [Ahoi2009]Seq 维护序列seq /*BZOJ 1798: [Ahoi2009]Seq 维护序列seq线段树主要是标记的顺序下放问题...乱搞一下就好. ...

  2. BZOJ1798: [Ahoi2009]Seq 维护序列seq

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  3. HYSBZ - 1798 Seq 维护序列seq 线段树lazy标记

    传送门 这道题属实是线段树的道比刷题,又加又乘的,当然还可能会有乘除,阶乘等等可能的情况. 对于这道题,主要的一个就是怎么记录lazy标记,首先的话一个数组是肯定不行的,设乘的为lazy,加的为add ...

  4. [Ahoi2009]Seq 维护序列seq

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

  5. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq(线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1798 之前写了个快速乘..........................20多s...... 还好 ...

  6. BZOJ1798 【AHOI2009】 seq维护序列 线段树

    维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把 ...

  7. 【线段树】[LUOGU 守墓人] [LUOGU 维护序列] 线段树模板题

    题目: 题目链接:[LUOGU 守墓人] 题解: 线段树单点修改,区间修改,单点查询,区间查询,一系列线段树基本操作,模板打就好. (回头再补一个分块和树状数组的这种板子题,就是用分块和树状数组再写一 ...

  8. hdu1754 I hate it线段树模板 区间最值查询

    题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...

  9. 线段树模板题3:区间染色问题

    1.3线段树模板题3:区间染色问题 在DotA游戏中,帕吉的肉钩实际上是大多数英雄中最恐怖的东西.挂钩由长度相同的几个连续的金属棍组成. 现在,帕吉(Pudge)希望对挂接进行一些操作. 让我们将钩子 ...

最新文章

  1. Altium Designer飞线(未连接线)不显示的解决方法
  2. 高级C语言教程编码风格
  3. Angular ng-content元素的学习笔记
  4. 单例模式---设计模式
  5. thinkphp仿百度文库网站源码
  6. oracle 的 父子关系,oracle父子关系树递归排序要注意什么?
  7. idea项目能放入eclipse_IDEA导入eclipse项目并且部署到tomcat的步骤详解
  8. Python图像的基本操作
  9. 【优化算法】寄生-捕食算法(PPA)【含Matlab源码 1801期】
  10. hdfs命令_HDFS命令
  11. 基于51单片机的双机通信系统设计protues仿真
  12. sqlite3数据库函数
  13. php+redis+保存多个值,php向redis list一次性lPush多个值
  14. maven-resources-plugin:2.6:resources (default-resources)
  15. 论文查重算法 python_个人项目之论文查重
  16. ORA-20011: Approximate NDV failed: ORA-00600: internal error code, arguments
  17. 包装严重的 IT 圈,作为面试官,是如何甄别应聘者呢?
  18. August Rush
  19. 电脑bluescreen蓝屏解决方法
  20. pandas合并excel

热门文章

  1. 计算机的组成 —— 显卡
  2. 重复抽样与非重复抽样
  3. Matlab Tricks(十)—— padarray 的实现
  4. 图论(一)—— 基本概念
  5. 用 scipy.weave 嵌入 C 语言
  6. scanf 在uefi中调用_BIOS、UEFI、Boot Loader都是些什么
  7. 小米5s升级Android8,小米5s、小米5s Plus升级8.0提前,好消息!
  8. python里w_python vs pythonw | 学步园
  9. python不会英语不会数学怎么自学-文科女生学Python:学过初中数学和英语就能懂的编程逻辑...
  10. python必背入门代码-python必背内容有哪些