P3373 【模板】线段树 2 (未完待续)
P3373 【模板】线段树 2
强烈安利这个大佬 超赞!!!
题解
本来以为这个题拿着线段树1的板子改改就好了,但是发现事情并没有那么简单,改了两天。。。
我们看到这个题其实涉及啦乘法和加法两种运算,如何把这两种运算同时塞到懒标记当中呢??似乎有些困难
!!!那么我们可以开两个懒标记啊,一个记录乘法mul[ ],一个记录加法add[ ]
初始化
add[ ] 初始化当然为0,不加减任何数
mul[ ] 初始化当然为1 ,不乘任何数
标记下传以及ADD运算的时候两者都要维护
运算顺序
当我们乘法和加法的懒标记都有的时候
是先加后乘呢?
还是先乘后加呢?
ans:先乘后加
注意
这个题数据算着算着就很大了,一定要都开long long
还有一点就是忽略掉 if (add [ ] ==0)
代码
#include<bits/stdc++.h>using namespace std;#define ll long long //一定要开long long ,不然会炸 const int maxn=1e7+10; ll n,m,x,y,v,opr,mod; ll a[maxn],add[maxn*4],mul[maxn*4]; //add[]加法懒标记,mul[]乘法懒标记 ll sum[maxn*4]; //前缀和 ll ans;void build(ll k,ll l,ll r) //建树 {mul[k]=1; //初始化乘法前缀和为1,表示不变 if(l==r){sum[k]=a[l]; return ;} ll mid=(l+r)>>1;build(k<<1,l,mid);build(k<<1|1,mid+1,r);sum[k]=(sum[k<<1]+sum[k<<1|1])%mod; }void Add(ll k,ll l,ll r,ll mulp,ll sump) //处理懒标记,先乘后加 {sum[k]=(sum[k]*mulp+(r-l+1)*sump)%mod;add[k]=(add[k]*mulp+sump)%mod;mul[k]=(mul[k]*mulp)%mod; }void pushdown(ll k,ll l,ll r,ll mid) //标记下传 { // if(add[k]==0) return ;Add(k<<1,l,mid,mul[k],add[k]);Add(k<<1|1,mid+1,r,mul[k],add[k]);add[k]=0; //清空懒标记 mul[k]=1; }void modifymul(ll k,ll l,ll r,ll x,ll y,ll v) //乘法区间修改 {if(x<=l&&r<=y) return Add(k,l,r,v,0);ll mid=(l+r)>>1;pushdown(k,l,r,mid);if(x<=mid) modifymul(k<<1,l,mid,x,y,v);if(mid<y) modifymul(k<<1|1,mid+1,r,x,y,v);sum[k]=(sum[k<<1]+sum[k<<1|1])%mod; //维护前缀和 }void modifysum(ll k,ll l,ll r,ll x,ll y,ll v) //加法区间修改 {if(x<=l&&r<=y) return Add(k,l,r,1,v);ll mid=(l+r)>>1;pushdown(k,l,r,mid);if(x<=mid) modifysum(k<<1,l,mid,x,y,v);if(mid<y) modifysum(k<<1|1,mid+1,r,x,y,v);sum[k]=(sum[k<<1]+sum[k<<1|1])%mod; }long long query(ll k,ll l,ll r,ll x,ll y) //区间询问 {if(x<=l&&r<=y) return sum[k];ll mid=(l+r)>>1;ll res=0;pushdown(k,l,r,mid);if(x<=mid) res+=query(k<<1,l,mid,x,y);if(mid<y) res+=query(k<<1|1,mid+1,r,x,y);return res%mod; }int main() {scanf("%ld%ld%ld",&n,&m,&mod);for(ll i=1;i<=n;i++)scanf("%ld",&a[i]);build(1,1,n);for(ll i=1;i<=m;i++){scanf("%ld%ld%ld",&opr,&x,&y);if(opr==1){scanf("%ld",&v);modifymul(1,1,n,x,y,v);}if(opr==2){scanf("%ld",&v);modifysum(1,1,n,x,y,v);}if(opr==3){ans=query(1,1,n,x,y);printf("%ld\n",ans%mod);}}return 0; }
转载于:https://www.cnblogs.com/xiaoyezi-wink/p/11105832.html
P3373 【模板】线段树 2 (未完待续)相关推荐
- Ubuntu1804和2004高版本,右键无法创建TXT文档的解决办法【未完待续】
Ubuntu1804和2004高版本,右键无法创建TXT文档的解决办法[未完待续] 问题: Ubuntu1804和2004高版本,右键无法创建TXT文档 解决办法1:[常用] 1.打开终端 2.输入: ...
- pythonb超分辨成像_Papers | 超分辨 + 深度学习(未完待续)
1. SRCNN 1.1. Contribution end-to-end深度学习应用在超分辨领域的开山之作(非 end-to-end 见 Story.3 ). 指出了超分辨方向上传统方法( spar ...
- 二叉树学习笔记(未完待续)
摘要 二叉树学习笔记(未完待续). 博客 IT老兵驿站. 前言 昨天(2019-11-07)复习红黑树,发现红黑树和二叉树密不可分,所以这里再复习一下二叉树. 在大学的时候,这块我很认真地学习了一遍. ...
- Linux下简单创建ThinkPHP 6.0的网站 - 简单前后端 (未完待续)
步骤 ssh user@ip-of-linux cd /var/www/ mkdir xiazai.rudon.cn cd xiazai.rudon.cn/ composer create-proje ...
- Spring Boot web开发(未完待续)
addViewController请求 attention: 想要把网站的图标换掉就在static下放一个 favicon.ico 的图标图片即可 Spring MVC 5.0.5官方文档 stati ...
- CentOS8搭建SonarQube9+SonarScanner+Postgresql+bitbucket+cppcheck 扫描C语言。(未完待续)
前提条件 带有您首选发行版的新安装的 Linux 服务器. 一.添加新用户sonar 1.添加一个新的用户帐户 使用命令创建一个新的用户帐户sonar. # adduser sonar 使用 为新用户 ...
- 《今日简史》读书笔记(未完待续)
<今日简史>读书笔记(未完待续) 这本书是尤瓦尔·赫拉利的简史三部曲的最后一本,前2本书是<未来简史>和<人类简史>.根据豆瓣上网友的评价,这本书是尤瓦尔·赫拉利写 ...
- linux引数列项目过长,Linux 命令个人总结====== 未完待续 个人认为比较重要
Linux 命令个人总结====== 未完待续 man [功能说明]: 查看帮助 [语法格式]: man [123456789]命令.文件. [选项参数]: 数字"1"表示用户命令 ...
- CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)
目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...
- Paper之BigGAN:ICLR 2019最新论文《LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS》(未完待续)
Paper之BigGAN:ICLR 2019最新论文<LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS> ...
最新文章
- 从产品经理向人工智能产品经理进阶 | 机器学习必备知识
- 【react】使用代理解决跨域问题
- linux存储--共享内存机制shm(十四)
- 全面讲解Python列表数组(四)什么是元组?元组跟列表数组的差异?元组的特征符号是啥子?
- NYOJ 620 真实的谎言
- 【网络配置】双网卡访问
- java集合类(简介)
- 关联省份与学校的级联HTML,JS实现的省份级联实例代码
- mysql 清空或删除表数据后,控制表自增列值的方法
- wcf高并发 mysql_WCF 高并发时客户端发送和服务端接收存在等待或延迟
- 转载 :sql server 2005 无法删除数据库 #Test,因为该数据库当前正在使用
- sql server从数据库导出导入教程
- LabView学习笔记——简易入门AND初级实战项目(计算器)
- 贝塔朗菲的一般系统论:系统的有序性和目的性
- 从oracle临时表理解会话与链接
- 全球游戏人热评CGDC 09 盛赞中国网游产业
- matlab求解积分总结
- 内存学习(三)内存泄露
- 互联网日报 | 1月12日 星期二 | 百度宣布组建智能汽车公司;京东成立京东科技子集团;QQ兴趣部落即将全面停运下线...
- java.sql.SQLException: The server time zone value‘xxxxxxxx‘ is unrecognized
热门文章
- java实现递归下降分析_使用递归实现检查未知层级目录中的文件-Java实用技能
- mysql proxies_priv_Mysql5.7.18利用MySQLproxies_priv实现类似用户组管理实例分享
- 计算机考试不用输入扩展名吗,本周末的 计算机等级考试,如果不想考0分,一定要花2分钟看完...
- linux操作小技巧
- 应用TP3.2.3的一些小问题(一)
- 基于Pytorch再次解析使用块的现代卷积神经网络(VGG)
- 淘淘商城FTP服务器、Redis和solr集群配置
- 【深度学习】弱/半监督学习解决医学数据集规模小、数据标注难问题
- Android移动开发之【Android实战项目】在Service中弹出Dialog对话框,即全局性对话框
- python如何扩展库_python的常用扩展库以及使用方式