P2023 [AHOI2009]维护序列
震惊,双倍经验,依旧是线段树的乘法修改
#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>>p;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(,,n);
cin>>m;
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 ;
}
P2023 [AHOI2009]维护序列的更多相关文章
- 洛谷 P2023 [AHOI2009]维护序列
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解
题目传送: P3373 [模板]线段树 2 P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
- [P2023][AHOI2009]维护序列(线段树)
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- 【luogu P2023 [AHOI2009]维护序列】 题解
题目链接:https://www.luogu.org/problemnew/show/P2023 把P3373改一改直接粘过来就A #include <iostream> #include ...
随机推荐
- SLAM+语音机器人DIY系列:(二)ROS入门——9.熟练使用rviz
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- Linux权限管理(week1_day5)--技术流ken
权限概述 Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者).group(和所有者同组的用户).others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身 ...
- Form 表单提交的几种方式
简单的总结一下form表单提交的几种方式:1.最简单的方式 就用form的submit提交方式,这种提交方式是不需要回调函数的 这种方式最近到一个form提供action路径后台接受就可以< ...
- c#下载文件选择路径控件
<input id="file1" style="width: 240px; height: 20px; display:none;" type=&quo ...
- .net 笔试面试总结(2)
在.net 中类(class) 与结构(Struct)的异同. Class 可以被实例化,属于引用类型,是分配在内存的堆上的.类是引用传递的. Struct 属于值类型,是分配在内存的栈上的.结构体是 ...
- 微信小程序 canvas 绘制圆形状
page({ // 绘制canvas drawCanvas:function(){ const ctx = wx.createCanvasContext('poster') // 画圆形二维码 thi ...
- 【土旦】在vue filters中 优雅的使用对象的key、value来替换 if switch多重判断简化流程
前言 之前写过滤器的时候都是 用 if switch 来进行值的判断 返回对应的值, 在没去百度搜索之前都是都是这样写的 ) { return "支付成功"; } ) { retu ...
- vuex最简单、最直白、最全的入门文档
前言 我们经常用element-ui做后台管理系统,经常会遇到父组件给子组件传递数据,下面一个简单的例子,点击按钮,把弹框显示变量数据通过子组件的props属性传递,子组件通过$emit事件监听把数据 ...
- 在VS 2017 下创建 Xamarin NuGet Package
最近在做一个Xamarin for android的项目,有个需求是一次可以从相册中选择多张图片,但是 android API<19 的版本还不支持一次选择多张图片,在网上找了一下,发现原生的组 ...
- Linux shell脚本中shift的用法说明
shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本). 示例1:依次读取输入的参数并打印参数个数:run ...