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 (未完待续)相关推荐

  1. Ubuntu1804和2004高版本,右键无法创建TXT文档的解决办法【未完待续】

    Ubuntu1804和2004高版本,右键无法创建TXT文档的解决办法[未完待续] 问题: Ubuntu1804和2004高版本,右键无法创建TXT文档 解决办法1:[常用] 1.打开终端 2.输入: ...

  2. pythonb超分辨成像_Papers | 超分辨 + 深度学习(未完待续)

    1. SRCNN 1.1. Contribution end-to-end深度学习应用在超分辨领域的开山之作(非 end-to-end 见 Story.3 ). 指出了超分辨方向上传统方法( spar ...

  3. 二叉树学习笔记(未完待续)

    摘要 二叉树学习笔记(未完待续). 博客 IT老兵驿站. 前言 昨天(2019-11-07)复习红黑树,发现红黑树和二叉树密不可分,所以这里再复习一下二叉树. 在大学的时候,这块我很认真地学习了一遍. ...

  4. Linux下简单创建ThinkPHP 6.0的网站 - 简单前后端 (未完待续)

    步骤 ssh user@ip-of-linux cd /var/www/ mkdir xiazai.rudon.cn cd xiazai.rudon.cn/ composer create-proje ...

  5. Spring Boot web开发(未完待续)

    addViewController请求 attention: 想要把网站的图标换掉就在static下放一个 favicon.ico 的图标图片即可 Spring MVC 5.0.5官方文档 stati ...

  6. CentOS8搭建SonarQube9+SonarScanner+Postgresql+bitbucket+cppcheck 扫描C语言。(未完待续)

    前提条件 带有您首选发行版的新安装的 Linux 服务器. 一.添加新用户sonar 1.添加一个新的用户帐户 使用命令创建一个新的用户帐户sonar. # adduser sonar 使用 为新用户 ...

  7. 《今日简史》读书笔记(未完待续)

    <今日简史>读书笔记(未完待续) 这本书是尤瓦尔·赫拉利的简史三部曲的最后一本,前2本书是<未来简史>和<人类简史>.根据豆瓣上网友的评价,这本书是尤瓦尔·赫拉利写 ...

  8. linux引数列项目过长,Linux 命令个人总结====== 未完待续 个人认为比较重要

    Linux 命令个人总结====== 未完待续 man [功能说明]: 查看帮助 [语法格式]: man [123456789]命令.文件. [选项参数]: 数字"1"表示用户命令 ...

  9. CC2530学习路线-基础实验-串口通讯发送字符串(4 未完待续)

    目录 1. 前期预备知识 1.1 串口通讯电路图 1.2 实验相关寄存器 1.2 常用波特率设置 本章未完待续..... 原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上. 1. 前 ...

  10. 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> ...

最新文章

  1. 从产品经理向人工智能产品经理进阶 | 机器学习必备知识
  2. 【react】使用代理解决跨域问题
  3. linux存储--共享内存机制shm(十四)
  4. 全面讲解Python列表数组(四)什么是元组?元组跟列表数组的差异?元组的特征符号是啥子?
  5. NYOJ 620 真实的谎言
  6. 【网络配置】双网卡访问
  7. java集合类(简介)
  8. 关联省份与学校的级联HTML,JS实现的省份级联实例代码
  9. mysql 清空或删除表数据后,控制表自增列值的方法
  10. wcf高并发 mysql_WCF 高并发时客户端发送和服务端接收存在等待或延迟
  11. 转载 :sql server 2005 无法删除数据库 #Test,因为该数据库当前正在使用
  12. sql server从数据库导出导入教程
  13. LabView学习笔记——简易入门AND初级实战项目(计算器)
  14. 贝塔朗菲的一般系统论:系统的有序性和目的性
  15. 从oracle临时表理解会话与链接
  16. 全球游戏人热评CGDC 09 盛赞中国网游产业
  17. matlab求解积分总结
  18. 内存学习(三)内存泄露
  19. 互联网日报 | 1月12日 星期二 | 百度宣布组建智能汽车公司;京东成立京东科技子集团;QQ兴趣部落即将全面停运下线...
  20. java.sql.SQLException: The server time zone value‘xxxxxxxx‘ is unrecognized

热门文章

  1. java实现递归下降分析_使用递归实现检查未知层级目录中的文件-Java实用技能
  2. mysql proxies_priv_Mysql5.7.18利用MySQLproxies_priv实现类似用户组管理实例分享
  3. 计算机考试不用输入扩展名吗,本周末的 计算机等级考试,如果不想考0分,一定要花2分钟看完...
  4. linux操作小技巧
  5. 应用TP3.2.3的一些小问题(一)
  6. 基于Pytorch再次解析使用块的现代卷积神经网络(VGG)
  7. 淘淘商城FTP服务器、Redis和solr集群配置
  8. 【深度学习】弱/半监督学习解决医学数据集规模小、数据标注难问题
  9. Android移动开发之【Android实战项目】在Service中弹出Dialog对话框,即全局性对话框
  10. python如何扩展库_python的常用扩展库以及使用方式