【洛谷P2023】维护序列

这个板子不打就是手生……一段时间不会处理线段树了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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

魔兽世界工程学技能1-375冲级攻略

魔兽世界工程学技能1-375级联盟部落完全冲级攻略 首先是20个劣质的石头10亚麻&#xff0c;做完20个***粉10次炸弹&#xff0c;就可以去学螺栓了。  准备80个铜锭&#xff0c;都做成螺栓。此时技能等级为60。  再来14个铜锭&#xff0c;做成一个扳手&#xff0c;4个铜管。学…

【分享】Web前端开发第三方插件大全

收集整理了一些Web前端开发比较成熟的第三方插件&#xff0c;分享给大家。 ******************************************************************************* 一、国外插件 ace 版本&#xff1a;1.2.3au官网&#xff1a;https://github.com/ajaxorg/ace-builds/许可&#xf…

线性直接变换方法对摄像机进行标定

具体实现过程如下&#xff1a; 1.从不同角度用摄像机对立方体盒子进行拍摄&#xff0c;得到一幅图像。如下&#xff1a; 2.在立方体盒子上选取至少6个点&#xff0c;获取这6个点的图像坐标和空间点坐标&#xff08;世界坐标系自己设定&#xff09;。如&#xff1a; 7 %点个数 0…

图灵2010.09书讯

图灵五周年活动汇集 &#xff1a; 【互动】图灵五周年盛大庆典 数千好书免费送 【互动】图灵五周年——纪念国际知名的UNIX和网络专家Stevens 【互动】图灵五周年——精品数学书买赠活动 【卓越】图灵五周年——纪念国际知名的UNIX和网络专家Stevens 【卓越】图灵5周年专题…

mysql中使用WITH ROLLUP

1:例子&#xff0c;有一张book表 2:执行sql求和 SELECTsum(age) FROMstudent GROUP BYage; 3:加上with ROLLUP 查询结果会加上一行&#xff0c;显示总和 SELECTsum(age) FROMstudent GROUP BYage with ROLLUP;

查看python内部模块命令,内置函数,查看python已经安装的模块命令

查看python内部模块命令&#xff0c;内置函数&#xff0c;查看python已经安装的模块命令 可以用dir(modules) 或者用 pip list或者用 help(modules) 或者用 python -m pydoc -p 1234都能列出所有已经安装的模块 转载于:https://www.cnblogs.com/zdz8207/p/python_learn_note_11…

php写的squid验证辅助器

2019独角兽企业重金招聘Python工程师标准>>> php写的squid验证辅助器2008-11-08 23:17公司的代理服务器用的是squid&#xff0c;基于IP地址和MAC地址进行权限验证允许部分用户访问Internet。无奈列位高手们早已通晓盗用IP、MAC的方法来绕过squid的限制。近来考虑改为…

动手动脑 - 继承与多态

1.运行 TestInherits.java 示例&#xff0c;观察输出&#xff0c;注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码&#xff0c;显式调用GrandParent的另一个构造函数&#xff0c;注意这句调用代码是否是第一句&#xff0c;影响重大&#xff01; 通过 super …

三、Eclipse快捷键

三、Eclipse快捷键 Ctrl1 快速修复(最经典的快捷键)CtrlD: 删除当前行 CtrlAlt↓ 复制当前行到下一行(复制增加)CtrlAlt↑ 复制当前行到上一行(复制增加)Alt↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了)Alt↑ 当前行和上面一行交互位置(同上)Alt← 前一个编…

IT职场的一些处事之道

掌握好方法&#xff0c;管理小企业的IT和管理大些企业的IT没有太大差别。和大家分享下我10年的工作经验吧&#xff0c;希望给后来者信心&#xff0c;给同行者以安慰。1。工作态度工作是为了自己永远记住&#xff0c;是为了自己&#xff0c;不要总是在抱怨。吃不了苦中总&#x…

centos 系统管理维护指南

# centos 系统管理维护指南 centos系统是服务器的首选系统&#xff0c;系统运维支持需要的内容汇总整理如下。 ### 系统管理------------------------------ 查看系统版本 cat /etc/redhat-release - 查看内核版本 uname -r ### 系统实用工具------------------------------…

SilverlightCMS开发之3经典三页面CMS浮现

随笔思路&#xff1a; CMS粗略介绍 CMS具体说明 一个ListBox的效果实例 一些RIA Service 实例 那个SL CMS 的效果。 下一步1CMS粗略介绍 1本来昨晚就弄好了的。今天又改了一天&#xff0c;加入了我去年写的一个CMS做后台管理和与数据库交互。 这一下整个东西在功能上就略显完整…

【Step1】【floyd】poj1125-Stockbroker Grapevine

题目链接 题目大意 一个有n个点的图中&#xff0c;求一个点&#xff0c;使得这个点到其他点的最短路的最长距离最短。 输入数据中&#xff0c;有多组测试。每组测试第一行为n&#xff0c;接下来n行&#xff0c;每行第一个x&#xff0c;xi表示第i个点和x个点有路径。接下来x个数…

只要付出就有回报

今天是个特别的日子——2010年10月10日——101010,。早上上班的路上就看到很多结婚的车队&#xff0c;很是壮观。我的小表妹也是今天结婚&#xff0c;可惜要上班无法参加她的婚礼。据说很是热闹&#xff0c;人不多&#xff0c;4桌洋人&#xff0c;4桌国人。呵呵。。。表妹在英国…