洛谷 P3373 线段树2

mul和pls更新某区间左右子树sum的时候,别忘了回头更新这个区间的sum

只有在传递给子序列之后,父序列的lz标记才能清零。其他时候,lz标记只增不减

#include <stdlib.h>
#include <cstdio>
#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
#include <math.h>
#include <algorithm>#define mem(t, v)   memset ((t) , v, sizeof(t))
#define INF 0x3f3f3f3f
#define eps 1e-8
typedef long long ll;using namespace std;const int MAX=100010;
ll n,m,a,x,y,k,p;
ll in[MAX];struct node{ll sum,l,r,plz,mlz;
}tree[MAX*4];void Build(ll i,ll l,ll r){tree[i].r=r,tree[i].l=l;tree[i].mlz=1;if(l==r){tree[i].sum=in[l]%p;tree[i].plz=0;return ;}ll mid=(l+r)>>1;Build(i<<1,l,mid);Build(i<<1|1,mid+1,r);tree[i].sum=(tree[i<<1].sum+tree[i<<1|1].sum)%p;
}inline void push_down(ll i){ll k1=tree[i].mlz,k2=tree[i].plz;tree[i].plz=0;tree[i].mlz=1;tree[i<<1].sum=(tree[i<<1].sum*k1+(tree[i<<1].r-tree[i<<1].l+1)*k2)%p;tree[i<<1|1].sum=(tree[i<<1|1].sum*k1+(tree[i<<1|1].r-tree[i<<1|1].l+1)*k2)%p;tree[i<<1].mlz=(tree[i<<1].mlz*k1)%p;tree[i<<1].plz=(tree[i<<1].plz*k1+k2)%p;tree[i<<1|1].mlz=(tree[i<<1|1].mlz*k1)%p;tree[i<<1|1].plz=(tree[i<<1|1].plz*k1+k2)%p;
}void mul(ll i,ll l,ll r,ll k){   //对于标记,乘的时候只管乘,加的时候只管加if(tree[i].l>=l&&tree[i].r<=r){tree[i].sum=(tree[i].sum*k)%p;tree[i].mlz=(tree[i].mlz*k)%p;tree[i].plz=(tree[i].plz*k)%p;   //乘的时候已经把加标记处理了,所以后续都是先乘后加return ;}if(tree[i].r<l||tree[i].l>r)return ;push_down(i);if(tree[i<<1].r>=l)mul(i<<1,l,r,k);if(tree[i<<1|1].l<=r)mul(i<<1|1,l,r,k);tree[i].sum=(tree[i<<1].sum+tree[i<<1|1].sum)%p;
}void pls(ll i,ll l,ll r,ll k){   //对于标记,乘的时候只管乘,加的时候只管加if(tree[i].l>=l&&tree[i].r<=r){tree[i].sum=(tree[i].sum+k*(tree[i].r-tree[i].l+1))%p;tree[i].plz=(tree[i].plz+k)%p;  //标记还是要加的,左右子树要用到return ;}if(tree[i].l>r||tree[i].r<l)return ;push_down(i);if(tree[i<<1].r>=l)pls(i<<1,l,r,k);if(tree[i<<1|1].l<=r)pls(i<<1|1,l,r,k);tree[i].sum=(tree[i<<1].sum+tree[i<<1|1].sum)%p;
}ll Search(ll i,ll l,ll r){ll k1=tree[i].mlz,k2=tree[i].plz;if(tree[i].l>=l&&tree[i].r<=r){return tree[i].sum;}if(tree[i].l>r||tree[i].r<l)return 0;push_down(i);ll s=0;if(tree[i<<1|1].l<=r)s+=Search(i<<1|1,l,r);if(tree[i<<1].r>=l)s+=Search(i<<1,l,r);return s;
}int main(){scanf("%lld%lld%lld",&n,&m,&p);for(int i=1;i<=n;i++){scanf("%lld",&in[i]);}Build(1,1,n);while(m--){scanf("%lld%lld%lld",&a,&x,&y);if(a==1){scanf("%lld",&k);mul(1,x,y,k);}else if(a==2){scanf("%lld",&k);pls(1,x,y,k);}else {ll ans=Search(1,x,y);printf("%lld\n",ans%p);}}return 0;
}

洛谷 P3373 线段树2相关推荐

  1. 洛谷P3373线段树

    洛谷P3373 线段树模板题,主要对懒标的处理要求比较高. 有三种操作: 区间加法 区间乘法 区间求和查询 tips:我们对一个区间进行乘k操作的时候,他之前可能存在加法lazy还没pushdown, ...

  2. 洛谷P3373 线段树2(乘法加法lazytag)

    线段树模板题,含lazytag的线段树码量本身就比较大,再加入乘法标记,还要考虑先乘后加的问题,本蒟蒻一调就是几个小时. P3373 [模板]线段树 2https://www.luogu.com.cn ...

  3. 洛谷P3373线段树2

    题目描述 区间查询区间修改,非常明显的线段树模板,但乘法和加法的结合,使问题有了些小改动: problem: 该题唯一的难点就是加法和乘法的lazytag的处理,设目前区间N.s(即区间和)=x,若先 ...

  4. 洛谷 P3373 线段树模板题

    链接:https://www.luogu.com.cn/problem/P3373 题意:一个区间 三种操作 1 给lr范围内乘一个数 2 给lr范围内加一个数 3 询问lr范围内的和 啊这题真·做了 ...

  5. 洛谷3373 线段树模板

    题目详情:https://www.luogu.org/problemnew/show/P3373 这个线段树模板写的头疼(最后纠错发现一个long long没开差点一口血喷出来),思路就是在普通的求区 ...

  6. [WC2005]双面棋盘,洛谷P4121,线段树分治+可撤销并查集

    正题 这题主要是来练手的,因为没写过可撤销的并查集,大概就是把每一个格子看成一个点,然后格子直接的边有很多的出现区间,把这些出现区间和对应的颜色打到线段树上,然后用可撤销的并查集来维护就可以了. #i ...

  7. 洛谷 3373 线段树

    传送门 思路: 关键在于乘与加的先后计算关系,(x + y) * k = x * k + y * k,从这里可以看出来,把加法转化为乘法计算,取消了+与*先后顺序 pushdown时,即为乘法标记 * ...

  8. 洛谷 P3373 【模板】线段树 2 题解

    洛谷 P3373 [模板]线段树 2 题解 题面 题目链接:[戳这里](https://www.luogu.org/problemnew/show/P3373) 题目描述 输入输出格式 输入输出样例 ...

  9. 洛谷 P3373 【模板】线段树 2 解题报告

    P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...

最新文章

  1. Linux TOP命令查询结果分析
  2. 辅助类BinaryTreeNodeIndex(用index索引代替指针)
  3. 候选JEP:记录和密封类型
  4. 计算机进管理提示找不到入口,win10系统开机提示xxxdll模块已加载但找不到入口点的教程...
  5. [css] 请说说*{box-sizing: border-box;}的作用及好处有哪些?
  6. x264 的 cache详解
  7. 风靡全球的15则数学动图:让你秒懂数学概念,看后觉得相见恨晚啊
  8. java 线程 内存分配内存_漫谈JAVA语言的内存分配
  9. Floyd算法及其应用
  10. 指纹识别 python实现_Python还真当是无所不能!利用Python做指纹识别播报!闻所未闻!-站长资讯中心...
  11. ansys大变形开关要不要打开_ANSYS与ABAQUS比较之实例7橡胶垫圈的受压分析
  12. java简单小程序 生日快乐,微信生日祝福小程序,要一个祝朋友生日快乐的VB小程序。...
  13. Flash CS4从入门到精通
  14. jabber android apk,Android版Jabber — 快速入门指南
  15. 【.NET IoT】把达特甲醛传感器DART WZ-S接到树莓派RaspberryPi 3 b+上
  16. 这一切,只因心中有梦
  17. 群晖Docker青龙面板部署方法V2.11.0
  18. day29 | 216.组合总和III 17.电话号码的字母组合
  19. 基于OpenCV的单目相机标定与三维定位
  20. vue html模板递归,vue使用递归组件实现多级列表

热门文章

  1. 知到答案 环境学概论 智慧树网课章节测试答案
  2. css打印适应纸张_使用原生css+js+html实现打印A4纸张的功能页面
  3. 苹果主屏幕按钮怎么设置_苹果手机屏幕变大怎么恢复
  4. 基于禾赛32线雷达和Xsens MTi-G-710 组合导航模块,松灵Scout mini 底盘实现 Cartographer 3D 建图过程
  5. 学生用计算机重启,学生用计算器咋关机
  6. 毛刺现象 java_记一次微服务耗时毛刺排查
  7. 网络对抗技术 实验三
  8. 装修以后很快后悔的80件事
  9. HelloWorld Detail Earth 3D Engine(二)城市渲染
  10. Android4.4电池电量命令行查看