OJ题号:洛谷2023、BZOJ1798

思路:

参见[洛谷3373]【模板】线段树 2

 #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]维护序列的更多相关文章

  1. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  2. [Luogu 2023] AHOI2009 维护序列

    [Luogu 2023] AHOI2009 维护序列 恕我冒昧这和线段树模板二有个琴梨区别? #include <cstdio> int n,m; long long p; class S ...

  3. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  4. 洛谷 2023 [AHOI2009]维护序列

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

  5. 洛谷 P2023 [AHOI2009]维护序列

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...

  6. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  7. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

  8. 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解

    题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...

  9. P2023 [AHOI2009]维护序列 题解(线段树)

    题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...

  10. bzoj1798 [Ahoi2009]维护序列

    Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...

随机推荐

  1. js 对象(object)合并

    var obj1 = { name:'lisi', checked:'true' }; var obj2 = { name:'zhangsan', age:18 }; Object.assign(ob ...

  2. JAVA之复制数组

    //复制数组 //Arrays.copyOf(arr, 5) //arr:要复制的对象,5为新数组的长度 import java.util.Arrays; public class Cope { pu ...

  3. EXcel vba 获取批注信息

    Public Function pizhu(i As Range) pizhu = i.Cells.Comment.Text End Function EXcel VBA获取批注信息

  4. python---数学表达式的分析树实现

    先走一遍, 前面很多知道点,都串起来了. # coding = utf-8 # 使用列表实现栈的功能 class Stack: def __init__(self): self.items = [] ...

  5. 实战--使用lvs实现四层负载均衡,转发到后端nginx

    这个帖子讲得很细致,基本依照这个方案实践. 只是IP是按我自己虚拟机的IP来测试的. http://www.cnblogs.com/arjenlee/p/9262737.html ========== ...

  6. weex用阿里矢量图

    首先这段代码来自 zwwill在github上的 weex网易严选项目 他是在utils下封装了一个方法 let utilFunc = { initIconFont () { let domModul ...

  7. linux 锁定重要文件 更改重要命令

    锁定重要文件如下: chattr +i /etc/passwd /etc/shadow /etc/groupp /etc/gshadow 解锁文件 chattr -i /etc/passwd /etc ...

  8. Orchard是如何工作的?

    文章翻译自http://docs.orchardproject.net/Documentation/How-Orchard-works 对Orchard的理解还不深刻,翻译可能有不好的地方.     ...

  9. Mac mumu模拟器设置代理

    adb devices adb connect 127.0.0.1:5555 adb shell am start -a android.intent.action.MAIN -n com.andro ...

  10. python写csv文件

    name=['lucy','jacky','eric','man','san'] place=['chongqing','guangzhou','beijing','shanghai','shenzh ...