[AHOI2009]维护序列
OJ题号:洛谷2023、BZOJ1798
思路:
#include<cstdio>
#include<cctype>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define ll long long
#define maxn 100001
#define root 1
#define _left <<1
#define _right <<1|1
int n,m;
ll mod;
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=((x+(x<<))<<)+(ch^'');
return x;
}
inline ll getll() {
char ch;
while(!isdigit(ch=getchar()));
ll x=ch^'';
while(isdigit(ch=getchar())) x=((x+(x<<))<<)+(ch^'');
return x;
}
struct SegmentTree {
ll val[maxn<<],add[maxn<<],mul[maxn<<];
void push_up(const int p) {
val[p]=(val[p _left]+val[p _right])%mod;
}
void build(const int p,const int b,const int e) {
mul[p]=;
add[p]=;
if(b==e) {
val[p]=getll()%mod;
return;
}
int mid=(b+e)>>;
build(p _left,b,mid);
build(p _right,mid+,e);
push_up(p);
}
int length(const int b,const int e) {
return e-b+;
}
void push_down(const int p,const int b,const int e) {
if(mul[p]!=) {
val[p _left]=val[p _left]*mul[p]%mod;
val[p _right]=val[p _right]*mul[p]%mod;
mul[p _left]=mul[p _left]*mul[p]%mod;
mul[p _right]=mul[p _right]*mul[p]%mod;
add[p _left]=add[p _left]*mul[p]%mod;
add[p _right]=add[p _right]*mul[p]%mod;
mul[p]=;
}
if(add[p]) {
int mid=(b+e)>>;
val[p _left]=(val[p _left]+add[p]*length(b,mid))%mod;
val[p _right]=(val[p _right]+add[p]*length(mid+,e))%mod;
add[p _left]=(add[p _left]+add[p])%mod;
add[p _right]=(add[p _right]+add[p])%mod;
add[p]=;
}
}
void modify_mul(const int p,const int b,const int e,const int l,const int r,const ll x) {
if((b==l)&&(e==r)) {
val[p]=val[p]*x%mod;
mul[p]=mul[p]*x%mod;
add[p]=add[p]*x%mod;
return;
}
push_down(p,b,e);
int mid=(b+e)>>;
if(l<=mid) modify_mul(p _left,b,mid,l,min(mid,r),x);
if(r>mid) modify_mul(p _right,mid+,e,max(mid+,l),r,x);
push_up(p);
}
void modify_add(const int p,const int b,const int e,const int l,const int r,const ll x) {
if((b==l)&&(e==r)) {
val[p]=(val[p]+x*length(b,e))%mod;
add[p]=(add[p]+x)%mod;
return;
}
push_down(p,b,e);
int mid=(b+e)>>;
if(l<=mid) modify_add(p _left,b,mid,l,min(mid,r),x);
if(r>mid) modify_add(p _right,mid+,e,max(mid+,l),r,x);
push_up(p);
}
ll query(const int p,const int b,const int e,const int l,const int r) {
if((b==l)&&(e==r)) {
return val[p];
}
int mid=(b+e)>>;
ll ans=;
push_down(p,b,e);
if(l<=mid) ans=(ans+query(p _left,b,mid,l,min(mid,r)))%mod;
if(r>mid) ans=(ans+query(p _right,mid+,e,max(mid+,l),r))%mod;
return ans;
}
};
SegmentTree tree;
int main() {
n=getint();
mod=getll();
tree.build(root,,n);
m=getint();
while(m--) {
int op=getint(),x=getint(),y=getint();
if(op==) {
ll k=getll()%mod;
tree.modify_mul(root,,n,x,y,k);
continue;
}
if(op==) {
ll k=getll()%mod;
tree.modify_add(root,,n,x,y,k);
continue;
}
printf("%lld\n",tree.query(root,,n,x,y));
}
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 ...
随机推荐
- js 对象(object)合并
var obj1 = { name:'lisi', checked:'true' }; var obj2 = { name:'zhangsan', age:18 }; Object.assign(ob ...
- JAVA之复制数组
//复制数组 //Arrays.copyOf(arr, 5) //arr:要复制的对象,5为新数组的长度 import java.util.Arrays; public class Cope { pu ...
- EXcel vba 获取批注信息
Public Function pizhu(i As Range) pizhu = i.Cells.Comment.Text End Function EXcel VBA获取批注信息
- python---数学表达式的分析树实现
先走一遍, 前面很多知道点,都串起来了. # coding = utf-8 # 使用列表实现栈的功能 class Stack: def __init__(self): self.items = [] ...
- 实战--使用lvs实现四层负载均衡,转发到后端nginx
这个帖子讲得很细致,基本依照这个方案实践. 只是IP是按我自己虚拟机的IP来测试的. http://www.cnblogs.com/arjenlee/p/9262737.html ========== ...
- weex用阿里矢量图
首先这段代码来自 zwwill在github上的 weex网易严选项目 他是在utils下封装了一个方法 let utilFunc = { initIconFont () { let domModul ...
- linux 锁定重要文件 更改重要命令
锁定重要文件如下: chattr +i /etc/passwd /etc/shadow /etc/groupp /etc/gshadow 解锁文件 chattr -i /etc/passwd /etc ...
- Orchard是如何工作的?
文章翻译自http://docs.orchardproject.net/Documentation/How-Orchard-works 对Orchard的理解还不深刻,翻译可能有不好的地方. ...
- Mac mumu模拟器设置代理
adb devices adb connect 127.0.0.1:5555 adb shell am start -a android.intent.action.MAIN -n com.andro ...
- python写csv文件
name=['lucy','jacky','eric','man','san'] place=['chongqing','guangzhou','beijing','shanghai','shenzh ...