ahoi2009维护序列
链接:https://www.luogu.org/problemnew/show/P2023
裸的线段树维护+*
代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 400010
#define mid (h+t)/2
#define ll long long
ll n,m,a[maxn],mo,c,d,e,lazy1[maxn],lazy2[maxn];
struct re
{
ll h,t,x;
}p[maxn];
void updata(ll x)
{
p[x].x=(p[x*].x+p[x*+].x)%mo;
}
void build(ll x,ll h,ll t)
{
p[x].h=h; p[x].t=t;
if (h==t)
{
p[x].x=a[h]; return;
}
build(x*,h,mid); build(x*+,mid+,t);
updata(x);
}
void down(ll x)
{
if (lazy2[x]!=)
{
p[x].x=(p[x].x*lazy2[x])%mo;
if (p[x].h!=p[x].t) //这一句效率有明显提高
{
lazy2[x*]=(lazy2[x*]*lazy2[x])%mo;
lazy2[x*+]=(lazy2[x*+]*lazy2[x])%mo;
lazy1[x*]=(lazy1[x*]*lazy2[x])%mo;
lazy1[x*+]=(lazy1[x*+]*lazy2[x])%mo;
}}
if (lazy1[x])
{
p[x].x=(p[x].x+lazy1[x]*(p[x].t-p[x].h+))%mo;
if (p[x].h!=p[x].t)
{
lazy1[x*]=(lazy1[x*]+lazy1[x])%mo;
lazy1[x*+]=(lazy1[x*+]+lazy1[x])%mo;
}}
lazy1[x]=; lazy2[x]=;
}
void change1(ll x,ll h,ll t,ll num)
{
down(x);
if (p[x].h>t||p[x].t<h) return;
if (h<=p[x].h&&p[x].t<=t)
{
lazy1[x]=(lazy1[x]+num)%mo;
down(x);
return;
}
change1(x*,h,t,num); change1(x*+,h,t,num);
updata(x);
}
void change2(ll x,ll h,ll t,ll num)
{
down(x);
if (p[x].h>t||p[x].t<h) return;
if (h<=p[x].h&&p[x].t<=t)
{
lazy1[x]=(lazy1[x]*num)%mo;
lazy2[x]=(lazy2[x]*num)%mo;
down(x);
return;
}
change2(x*,h,t,num); change2(x*+,h,t,num);
updata(x);
}
ll query(ll x,ll h,ll t)
{
down(x);
if (p[x].h>t||p[x].t<h) return();
if (h<=p[x].h&&p[x].t<=t) return(p[x].x);
return((query(x*,h,t)+query(x*+,h,t))%mo);
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m>>mo;
for (ll i=;i<=n;i++) cin>>a[i];
for (int i=;i<=maxn-;i++) lazy2[i]=;
build(,,n);
for (ll i=;i<=m;i++)
{
int c,d,e,f;
cin>>c;
if (c==)
{
cin>>d>>e>>f;
change2(,d,e,f);
}
if (c==)
{
cin>>d>>e>>f;
change1(,d,e,f);
}
if (c==)
{
cin>>d>>e;
cout<<query(,d,e)%mo<<endl;
}
}
return ;
}
ahoi2009维护序列的更多相关文章
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [Luogu 2023] AHOI2009 维护序列
[Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 洛谷 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\),我这种做法可能会使结果产生负数.于是就有了这 ...
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...
随机推荐
- buildroot构建项目(七)--- u-boot 2017.11 适配开发板修改 4 ---- 系统启动初始化之四
设置完寄存器控制器后,则跳出cpu_init_crit,进入_main 函数.即进入crt0.S (arch\arm\lib) 跟着代码流程慢慢走 一.crt0.S 1.1 第一步执行代码 /* 预 ...
- [C++]指针/指针数组/数组指针/多维指针/单值指针/多值指针
int main(){ //单值指针(指向单个值得指针,类同普通变量) int *px = new int; *px = 100; printf("%d",*px); delete ...
- ado.net 访问excel
1 类:OleDbConnection ... 2 connection string : Provider=Microsoft.ACE.OLEDB.12.0;Data Source={excelPa ...
- 寻路优化(一)——二维地图上A*启发函数的设计探索
工作中需要优化A*算法,研究了一天,最后取得了不错的效果.看网上的朋友还没有相关的研究,特此记录一下.有错误欢迎大家批评指正.如需转载请注明出处,http://www.cnblogs.com/Leon ...
- luogu P4161 [SCOI2009]游戏
传送门 我们发现整个大置换中,会由若干形如\((a_1\rightarrow a_2,a_2\rightarrow a_3,...a_{n-1}\rightarrow a_n,a_n\rightarr ...
- jQuery - ajaxUpLoad.js
ajaxFileUpload是一个异步上传文件的jQuery插件 语法:$.ajaxFileUpload([options]) options参数说明: 参数 作用 url 上传处理程序地址 file ...
- Caffe2 Detectron安装错误记录
caffe2 caffe2的安装方法有几种.其中最方便的是conda install.但是要求必须安装Anaconda. conda install -c caffe2 caffe2-cuda8.0- ...
- mysql逗逼的.frm文件恢复数据库
mysql数据库用.frm文件进行恢复. 背景:mac系统 .frm文件 (1)打开终端:输入cd /usr/local 回车. (2)输入 ls 回车. 这时候 打开finder ---> ...
- TabCtrl使用
TabCtrl使用 0x1 新建子页面 插入三个对话框,ID分别为:IDD_PAGE_FILE.IDD_PAGE_NETWORK.IDD_PAGE_PROCESS 工具箱-[属性]-[Style]设置 ...
- Python|绝不乱入的靠谱书单