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. excel生成数据

    Sub function1()Dim i As LongFor i = 1 To 1000000Cells(i, 1) = "A" & iCells(i, 2) = &qu ...

  2. spring cloud 使用spring cloud bus自动刷新配置

    Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitMQ.Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置的变化 ...

  3. 创建Python虚拟环境

    以window为例: 安装完python后, 打开cmd, 命令行输入: pip install virtualenv ,安装过程见截图 进入你想安装虚拟环境的目录, 命令行输入: virtualen ...

  4. IDEA中每次拷贝一个项目的时候必须标记一下配置文件resources,否则报错

  5. Nancy 返回值详解

    简介 Nancy 是一个轻量级的,简单粗暴的framework用来构建基于HTTP的各种服务,兼容.Net和Mono.它的返回值也是多种多样的,适应各种不同的情况.包括Response.AsFile( ...

  6. js数字货币格式互转

    //将1,234,567.00转换为1234567.00 function moneyToNumValue(val) { var num = val.trim(); var ss = num.toSt ...

  7. [转]Java Web笔记:搭建环境和项目配置(MyEclipse 2014 + Maven + Tomcat)

    来源:http://www.jianshu.com/p/56caa738506a 0. 绪言 Java Web开发中,除了基础知识外,开发环境搭建,也是一项基本功.开发环境包括了IDE.项目管理.项目 ...

  8. Zabbix微信报警触发

    (1)         企业应用-创建应用 1.除了对个人添加微信报警之外,还可以添加不同管理组,接受同一个应用推送的消息, 成员账号,组织部门ID,应用Agent ID,CorpID和Secret, ...

  9. Codeforces 354B dp Game with Strings dp

    Game with Strings 题意并不是在图上走,看了好久才看出来.. dp[ i ][ mask ]表示从 i 层开始走,起点有mask个, a的个数-b的个数的  最大值或者最小值. #in ...

  10. 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)

    注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...