这个板子不打就是手生……一段时间不会处理线段树了qwq,这个题难点就是在于下放标记

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long lo;
lo n,p,m,a[100010],x,y,z,fl,qwq;
struct in
{lo l,r,s,f1,f2;
}ter[400040];
inline void re(lo &c)
{c=0;char b=getchar();while(b<'0'||b>'9')b=getchar();while(b>='0'&&b<='9')c=c*10+b-'0',b=getchar();
}
inline void u(lo w)
{ter[w].s=((ter[w<<1].s%p)+(ter[w<<1|1].s%p))%p;
}
inline void build(lo l,lo r,lo w)
{ter[w]=(in){l,r,0,1,0};if(l==r){ter[w].s=a[l];return;}lo mid=l+r>>1;build(l,mid,w<<1),build(mid+1,r,w<<1|1);u(w);
}
inline void d(lo w)
{lo f1=ter[w].f1,f2=ter[w].f2;if(f1==1&&f2==0)return;ter[w<<1].f1*=f1,ter[w<<1].f1%=p;//不管加法还是乘法的flag都要乘上他们父亲的乘法flag ter[w<<1|1].f1*=f1,ter[w<<1|1].f1%=p;ter[w<<1].f2*=f1,ter[w<<1].f2%=p;ter[w<<1|1].f2*=f1,ter[w<<1|1].f2%=p;ter[w<<1].f2+=f2,ter[w<<1].f2%=p;//加法还要加上 ter[w<<1|1].f2+=f2,ter[w<<1|1].f2%=p;ter[w<<1].s*=f1,ter[w<<1].s%=p;//先乘再加 ter[w<<1|1].s*=f1,ter[w<<1|1].s%=p;ter[w<<1].s+=f2*(ter[w<<1].r-ter[w<<1].l+1),ter[w<<1].s%=p;ter[w<<1|1].s+=f2*(ter[w<<1|1].r-ter[w<<1|1].l+1),ter[w<<1|1].s%=p;ter[w].f1=1,ter[w].f2=0;//乘法的flag赋为1是因为最起码*1,不能*0
}
void cha1(lo l,lo r,lo jia,lo w)
{if(ter[w].l==l&&ter[w].r==r)//乘法是一起乘
    {ter[w].f1*=jia,ter[w].f1%=p;ter[w].f2*=jia,ter[w].f2%=p;ter[w].s*=jia,ter[w].s%=p;return;}d(w);lo mid=ter[w].l+ter[w].r>>1;if(r<=mid)cha1(l,r,jia,w<<1);else if(l>mid)cha1(l,r,jia,w<<1|1);elsecha1(l,mid,jia,w<<1),cha1(mid+1,r,jia,w<<1|1);u(w);
}
void cha2(lo l,lo r,lo jia,lo w)
{if(ter[w].l==l&&ter[w].r==r)//加法是单独加在加法的flag上
    {ter[w].f2+=jia,ter[w].f2%=p;ter[w].s+=jia*(ter[w].r-ter[w].l+1),ter[w].s%=p;return;}d(w);lo mid=ter[w].l+ter[w].r>>1;if(r<=mid)cha2(l,r,jia,w<<1);else if(l>mid)cha2(l,r,jia,w<<1|1);elsecha2(l,mid,jia,w<<1),cha2(mid+1,r,jia,w<<1|1);u(w);
}
lo ask(lo l,lo r,lo w)
{if(ter[w].l==l&&ter[w].r==r)return ter[w].s;lo mid=ter[w].l+ter[w].r>>1,re=0;d(w);if(r<=mid)re+=ask(l,r,w<<1)%p;else if(l>mid)re+=ask(l,r,w<<1|1)%p;elsere+=ask(l,mid,w<<1)%p,re+=ask(mid+1,r,w<<1|1)%p;u(w);return re;
}
int main()
{re(n),re(p);for(int i=1;i<=n;i++)re(a[i]);build(1,n,1);//建树
    re(m);for(int i=1;i<=m;i++){re(fl),re(x),re(y);if(fl==1)re(z),cha1(x,y,z,1);//区间乘 if(fl==2)re(z),cha2(x,y,z,1);//区间加 if(fl==3)qwq=ask(x,y,1)%p,printf("%lld\n",qwq);//查询
    }
}

转载于:https://www.cnblogs.com/Loi-dfkdsmbd/articles/7806380.html

【洛谷P2023】维护序列相关推荐

  1. 洛谷P2023 [AHOI2009]维护序列

    数据比线段树2要毒瘤,一直60分的原因是: 1.long long 没开 2.没有边做边%或者像我P3373一样写了个看着像的边做边% 3.要看注释的话可以跳到P3373 上代码 1 #include ...

  2. 洛谷 - P3246 [HNOI2016]序列(莫队+单调栈)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,再给出 mmm 次询问,每次询问需要回答一个区间 [l,r][l,r][l,r] 内所有子区间的最小值之和 题目分析:因为可以离线,所以考 ...

  3. 【洛谷P1430】序列取数【dp】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P1430 给定一个长为n的整数序列,由A和B轮流取数(A先取).每个人可从序列的左端或右端取若干个数 ...

  4. 洛谷 - P3321 [SDOI2015]序列统计(原根+NTT)

    题目链接:点击查看 题目大意:给出一个集合 SSS,集合中的数是 [0,m)[0,m)[0,m) 且互不相同的,问从集合中选 nnn 次数字,且乘积对 mmm 取模后等于 xxx 的方案数有多少 题目 ...

  5. YBTOJ洛谷P2042:维护数列(平衡树)

    文章目录 题目描述 解析 删除区间 插入数列 修改&翻转 区间和&最大子段和 代码 传送门 题目描述 解析 阴间题- 这不是裸的板子吗? 国赛真的有人能把这题写出来吗- 应该算一道练习 ...

  6. 洛谷P2501数字序列 动态规划

    题目 题目链接 题解 这道题目我觉得是神题,非常有意思的题目,也挺难做的. 第一问:求最少需要改变的数量 这一问比较简单,之前也见过这种套路. 定义dp[i]dp[i]dp[i]表示aaa序列中a[1 ...

  7. 洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

    P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000- 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...

  8. 洛谷P3648 [APIO2014]序列分割(斜率优化)

    传送门 没想到这种多个状态转移的还能用上斜率优化--学到了-- 首先我们可以发现,切的顺序对最终答案是没有影响的 比方说有一个序列$abc$,每一个字母都代表几个数字,那么先切$ab$再切$bc$,得 ...

  9. 洛谷P3152 正整数序列

    文章目录 题目 思路 AC代码 后言 题目 正整数序列 思路 其实这是一个数学题目..并不需要使用递归求解. 其实在数学中每个数都能表示成2的幂总和 比如 127=20+21+22+23+24+25+ ...

最新文章

  1. Exception loading sessions from persistent storage
  2. shell实例第4讲:批量创建用户
  3. js中当等于最小值是让代码不执行_JavaScript中最最基础的知识点
  4. WPF 四种不同效果呼吸灯
  5. 时间小知识对于时间转换可能有帮助
  6. 山寨版项目管理经验小结
  7. Docker学习总结(48)——Docker 四种网络模式温故
  8. 使用C#调用外部序或是执行DOS命令
  9. 简单易懂实例说明如何设计子网掩码
  10. 空间查询时出错误 An expected Field was not found or could not be retrieved properly. [SHAPE.AREA] 问题的解决...
  11. 使用eeupdate修改机器网卡mac地址
  12. matplotlib-27 内嵌环形饼图
  13. 谷歌浏览器的视频下载插件推荐
  14. iOS苹果开发者账号(公司账号)申请流程详解
  15. teamviewer Android 8,利用TeamViewer控制设备
  16. 课程学习与自步学习Curriculum learning and self-paced learning:极简入门
  17. 老兵新传 Visual Basic核心编程及通用模块开发pdf
  18. esp8266 wifi信号强度示意表
  19. 时态的重建--适合理工直男的钟平老师逻辑英语学习笔记
  20. ApacheCN Python 译文集(二)20211110 更新

热门文章

  1. 【转】sip中的subscribe和notify扩展应用技术
  2. JS组件系列——Bootstrap 树控件使用经验分享 - 懒得安分 - 博客园
  3. es6 --- 使用生成器交替执行
  4. JavaScript --- 表单focus,blur,change事件的实现
  5. 01 React初步认知、React元素、渲染、工程化
  6. 395. Longest Substring with At Least K Repeating Characters
  7. iOS显示性能优化过程讲解
  8. 教你如何在 elasticsearch 中重建索引
  9. 分配的访问权限的展台应用:最佳做法
  10. 3.过滤数据 ---SQL