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. ajax请求数据时什么时候用GET,什么时候用POST

    GET的目的就如同其名字一样是用于获取信息的.它旨在显示出页面上你要阅读的信息.浏览器会缓冲GET请求的执行结果,如果同样的GET请求再次发出,浏览器就会显示缓冲的结果而不是重新运行整个请求.重新请求 ...

  2. Loadrunner11.0 录制手机App脚本的方法一

    使用Loadrunner录制手机终端App脚本 1. 说明 目前手机APP上的功能日益丰富,对手机应用功能的性能测试需求也越来越多.公司比较抠门没有花钱买Loadrunner,可怜我们工作中一直用的破 ...

  3. WBXML 1.3协议摘要

    协议地址:WAP195   网络字节顺序:big-endian.   为什么要加0x40? 参考:Compressing XML When an element contains content (t ...

  4. C. cltt的幸运数LCAdfs

    /*C: cltt的幸运数 Time Limit: 1 s      Memory Limit: 128 MB Submit Problem Description 一棵树有n个节点,共m次查询,查询 ...

  5. 金蝶核算项目余额表卡号余额与天财商龙CRM卡号余额对比

    金蝶核算项目余额表卡号余额与天财尚龙CRM卡号余额对比 由于历史遗留问题,财务一直不调账,修改核算科目卡号与天财商龙CRM系统一直,只能用VBA把卡号前缀修改成两边一致. 再通过,Power BI D ...

  6. 【C++ Primer | 07】泛型算法

    定制操作 #include <iostream> #include <string> #include <vector> #include <algorith ...

  7. C#学习-面向对象

    封装:把客观事物封装成类,并将类内部的实现隐藏,以保证数据的完整性: 比如年龄赋值为负数,就是个例子.当我们把类的字段定义为公共类型时,外部对象可以直接对类内部的数据进行操作,此时无法对这些操作进行一 ...

  8. linux inotify 文件变化检测

    用webstorm开发angular项目的时候,改写文件后发现热更新有时候会失效,从而不得不重新运行下项目,然而这浪费了好多时间,google一番后,解决办法如下 echo fs.inotify.ma ...

  9. Introduction to boundary integral equations in BEM

    Boundary element method (BEM) is an effective tool compared to finite element method (FEM) for resol ...

  10. Centos安装Samba共享服务器

    安装Samba 查看Samba是否已安装 1.# rpm -qa | grep samba