P3373 【模板】线段树 2
线段树的模板,但是还应注意维护乘标记,乘法的优先级大于加法,一定记得还要取模。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct sege_tree
{
int l;
int r;
long long lazymul;
long long lazyadd;
long long v;
}tree[*maxn];
int a[maxn];
long long p,ans;
int n,m,opt,l,r;
long long t;
void build(int now,int l,int r)
{
tree[now].l=l;
tree[now].r=r;
tree[now].lazymul=;
tree[now].lazyadd=;
if(l==r)
{
tree[now].v=a[l];
return;
}
else
{
int mid=(l+r)>>;
build(now*,l,mid);
build(now*+,mid+,r);
tree[now].v=tree[now*].v+tree[now*+].v;
}
tree[now].v%=p;
return;
}
void pushdown(int now,int l,int r)//标记下传
{
int mid=(l+r)>>;
tree[now*].v=(tree[now*].v*tree[now].lazymul+tree[now].lazyadd*(mid-l+))%p;
tree[now*+].v=(tree[now*+].v*tree[now].lazymul+tree[now].lazyadd*(r-mid))%p;
tree[now*].lazymul=(tree[now*].lazymul*tree[now].lazymul)%p;
tree[now*+].lazymul=(tree[now*+].lazymul*tree[now].lazymul)%p;
tree[now*].lazyadd=(tree[now*].lazyadd*tree[now].lazymul+tree[now].lazyadd)%p;
tree[now*+].lazyadd=(tree[now*+].lazyadd*tree[now].lazymul+tree[now].lazyadd)%p;
tree[now].lazymul=;
tree[now].lazyadd=;
return;
}
void update1(int now,int stdl,int stdr,int l,int r,long long k)
{
if(l>stdr||r<stdl)
{
return;
}
if(l<=stdl&&r>=stdr)
{
tree[now].v=(tree[now].v*k)%p;
tree[now].lazymul=(tree[now].lazymul*k)%p;
tree[now].lazyadd=(tree[now].lazyadd*k)%p;
return;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
update1(now*,stdl,mid,l,r,k);
update1(now*+,mid+,stdr,l,r,k);
tree[now].v=(tree[now*].v+tree[now*+].v)%p;
return;
}
void update2(int now,int stdl,int stdr,int l,int r,long long k)
{
if(l>stdr||r<stdl)
{
return;
}
if(l<=stdl&&r>=stdr)
{
tree[now].lazyadd=(tree[now].lazyadd+k)%p;
tree[now].v=(tree[now].v+k*(stdr-stdl+))%p;
return;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
update2(now*,stdl,mid,l,r,k);
update2(now*+,mid+,stdr,l,r,k);
tree[now].v=(tree[now*].v+tree[now*+].v)%p;
}
long long query(int now,int stdl,int stdr,int l,int r)
{
if(stdl>r||stdr<l)
{
return ;
}
if(stdl>=l&&stdr<=r)
{
return tree[now].v;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
return (query(now*,stdl,mid,l,r)+query(now*+,mid+,stdr,l,r))%p;
}
int main()
{
cin>>n>>m>>p;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(,,n);
while(m--)
{
scanf("%d",&opt);
if(opt==)
{
cin>>l>>r>>t;
update1(,,n,l,r,t);
}
else if(opt==)
{
cin>>l>>r>>t;
update2(,,n,l,r,t);
}
else
{
cin>>l>>r;
cout<<query(,,n,l,r)<<endl;
}
}
return ;
}
真的还需要耐心啊!
P3373 【模板】线段树 2的更多相关文章
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- hdu 1754 I Hate It (模板线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others) M ...
- hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询
点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...
- 【线段树】【P3372】模板-线段树
百度百科 Definition&Solution 线段树是一种log级别的树形结构,可以处理区间修改以及区间查询问题.期望情况下,复杂度为O(nlogn). 核心思想见百度百科,线段树即将每个 ...
- 算法模板——线段树6(二维线段树:区域加法+区域求和)(求助phile)
实现功能——对于一个N×M的方格,1:输入一个区域,将此区域全部值作加法:2:输入一个区域,求此区域全部值的和 其实和一维线段树同理,只是不知道为什么速度比想象的慢那么多,求解释...@acphile ...
- 【洛谷 p3373】模板-线段树 2(数据结构--线段树)
题意:已知一个数列,你需要进行下面三种操作:1.将某区间每一个数加上x:2.将某区间每一个数乘上x:3.求出某区间每一个数的和. 解法:(唉 :-(,这题卡住我了......)对于加法和乘法的混合操作 ...
- 【洛谷 p3372】模板-线段树 1(数据结构--线段树)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数加上x:2.求出某区间每一个数的和. 解法:如题,模版题.需要加上 lazy 标记,也就是我的 upd.lazy 标记的思路就是对一个结 ...
- hdu 1754 I Hate It (线段树、单点更新)(PS:ios::sync_with_stdio(false)可以加快cin、cout的读取写出速度)
I Hate ItTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- poj 3468 A Simple Problem with Integers 线段树 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=3468 线段树模板 要背下此模板 线段树 #include <iostream> #include <vector> ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
随机推荐
- SQL慢查询测试实践
1.开启慢查询的目的 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能. 2.设置mysql慢查询 方法一:全局变量设置(临时生效) ...
- 分布式基础通信协议:paxos、totem 和 gossip(转载)
背景: 在分布式中,最难解决的一个问题就是多个节点间数据同步问题.为了解决这样的问题,涌现出了各种奇思妙想.只有在解决了如何进行信息同步的基础之上才衍生出形形色色的应用.这里开始介绍几种分布式通信协议 ...
- 前端笔记之移动端&响应式(中)视口&百分比布局&弹性盒模型&rem&fillpage
一.viewport视口 1.1什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 屏幕尺寸:指屏幕的对角线的长度,单位是英寸,常见的屏幕尺寸有3.5.3.7.4.2.4.7.5.0.5.5.6.0等. 屏幕 ...
- 强化学习(十一) Prioritized Replay DQN
在强化学习(十)Double DQN (DDQN)中,我们讲到了DDQN使用两个Q网络,用当前Q网络计算最大Q值对应的动作,用目标Q网络计算这个最大动作对应的目标Q值,进而消除贪婪法带来的偏差.今天我 ...
- 《Unity3D/2D游戏开发从0到1》正式出版发行
<Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息: 书籍的名称: <Uni ...
- mysql获取某个表中除了某个字段名外的所有字段名
现一个表中有很多字段,但我不想要其中某一个字段,手打出来字段太多,不方便. SELECT GROUP_CONCAT( column_name SEPARATOR ',' ) FROM informat ...
- VSCode瞎折腾记
搬到小机房后终于能用VSCode啦(没错以前的系统是xp) 但是这东西比Dev难搞多了qwq,简单记一下自己的DIY历程吧(不然全搞炸就凉了) 设置语言为中文 可以直接下载插件 让VSCode支持编译 ...
- “宇宙最强” IDE,Visual Studio 2019 正式发布
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文由葡萄城翻译并发布 今天凌晨Visual Studio 2019已经正式发布,现在已经可以下载了.使用V ...
- Vue与React两个框架的区别对比
简单介绍 React--Facebook创建的JavaScript UI框架.它支撑着包括Instagram在内的大多数Facebook网站.React与当时流行的jQuery,Backbone.js ...
- rabbitmq之基本原理及搭建单机环境
1.RabbitMQ基本原理 1.MQ全称Message Queue,是一种分布式应用程序的通信方法,是消费-生产者模型的典型代表,producer向消息队列中不断写入消息,而另一端consumer则 ...