题意

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式:

(1)把数列中的一段数全部乘一个值;

(2)把数列中的一段数全部加一个值;

(3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

\(n,m \leq 10^5\)

分析

线段树模板题,努力打一下就好了。

维护kx+b这种形式的标记是要注意:

下放标记先乘再加,乘的时候要照顾加法标记,加的时候不用管乘法标记。

代码

#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#define rg register
#define co const
#define il inline
#pragma GCC optimize ("O3")
using namespace std;
template<class T> il T read(rg T&x)
{
rg T data=0;
rg int w=1;
rg char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff; const int MAXN=1e5+7;
int mod; struct node
{
int sumv; il node(rg co int&s=0):sumv(s){} il node operator+(rg const node&rhs)const
{
return node((sumv + rhs.sumv) % mod);
}
}; int ql,qr,v;
struct SegTree
{
node data[MAXN<<2];
int addv[MAXN<<2],mulv[MAXN<<2];
#define lson (now<<1)
#define rson (now<<1|1)
il void build(rg int now,rg int l,rg int r)
{
addv[now]=0,mulv[now]=1;
if(l==r)
{
read(data[now].sumv);
return;
}
rg int mid=(l+r)>>1;
build(lson,l,mid);
build(rson,mid+1,r);
data[now]=data[lson]+data[rson];
} il void pushdown(rg int now,rg int l,rg int r)
{
if(mulv[now]!=1)
{
data[lson].sumv = (ll) data[lson].sumv * mulv[now] % mod,
addv[lson] = (ll) addv[lson] * mulv[now] % mod;
mulv[lson] = (ll) mulv[lson] * mulv[now] % mod;
data[rson].sumv = (ll) data[rson].sumv * mulv[now] % mod,
addv[rson] = (ll) addv[rson] * mulv[now] % mod;
mulv[rson] = (ll) mulv[rson] * mulv[now] % mod;
mulv[now] = 1;
}
if(addv[now])
{
rg int mid=(l+r)>>1;
(data[lson].sumv += (ll) (mid - l + 1) * addv[now] % mod ) %= mod,
(addv[lson] += addv[now]) %= mod;
(data[rson].sumv += (ll) (r - mid) * addv[now] % mod) %= mod,
(addv[rson] += addv[now]) %= mod;
addv[now]=0;
}
} il node query(rg int now,rg int l,rg int r)
{
if(ql<=l&&r<=qr)
{
return data[now];
}
pushdown(now,l,r);
rg int mid=(l+r)>>1;
if(qr<=mid)
return query(lson,l,mid);
if(ql>=mid+1)
return query(rson,mid+1,r);
return query(lson,l,mid)+query(rson,mid+1,r);
} il void mul(rg int now,rg int l,rg int r)
{
if(ql<=l&&r<=qr)
{
data[now].sumv = (ll)data[now].sumv * v % mod,
addv[now] = (ll)addv[now] * v % mod,
mulv[now] = (ll)mulv[now] * v % mod;
return;
}
pushdown(now,l,r);
rg int mid=(l+r)>>1;
if(ql<=mid)
mul(lson,l,mid);
if(qr>=mid+1)
mul(rson,mid+1,r);
data[now]=data[lson]+data[rson];
} il void add(rg int now,rg int l,rg int r)
{
if(ql<=l&&r<=qr)
{
(data[now].sumv += (ll)(r - l + 1) * v % mod) %= mod,
(addv[now] += v) %= mod;
return;
}
pushdown(now,l,r);
rg int mid=(l+r)>>1;
if(ql<=mid)
add(lson,l,mid);
if(qr>=mid+1)
add(rson,mid+1,r);
data[now]=data[lson]+data[rson];
}
}T; int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
rg int n,m;
read(n);read(mod);
T.build(1,1,n);
read(m);
while(m--)
{
rg int opt;
read(opt);
if(opt==1) // mul
{
read(ql);read(qr);read(v);
T.mul(1,1,n);
}
else if(opt==2) // add
{
read(ql);read(qr);read(v);
T.add(1,1,n);
}
else if(opt==3)
{
read(ql);read(qr);
printf("%d\n",T.query(1,1,n).sumv);
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}

LG2023 [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\),我这种做法可能会使结果产生负数.于是就有了这 ...

随机推荐

  1. centos7: svbversion版本的安装配置+tortoisesvn登录验证

    centos7: svbversion版本的安装配置+tortoisesvn登录验证 命令工具:svnadmin create #创建版本库 hotcopy #版本库热备份 Islocks #打印所有 ...

  2. 20170724wdVBA正则表达式提取答案到Excel

    Public Sub RegExtractData() Dim StartTime, UsedTime StartTime = VBA.Timer Dim FilePath$ Dim FileName ...

  3. 20170621xlVBA跨表转换数据

    Sub 跨表转置() Dim Wb As Workbook Dim Sht As Worksheet Dim oSht As Worksheet Dim Rng As Range Dim Index ...

  4. 一个登陆浏览api接口; 其他相关: Form_with参数的不同写法; 简单使用curl。

    eeting-up app: 完成一个需求: 完成:https://github.com/chentianwei411/meeting-up-app 第四步实现API接口 Add api base a ...

  5. memcached-1.4.20 主要启动流程笔记

    以下笔记主要是关注tcp模式下memcached的启动过程. main() 设置信号处理函数为sig_handler() 初始化系统设置,保存在全局变量settings里面 settings_init ...

  6. IE6不兼容hover已解决

    新建一个csshover.htc文件,一下是csshover.htc内容 <public:attach event="ondocumentready" onevent=&qu ...

  7. 变形CSS3

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head>    < ...

  8. setuid和setgid

    关于有效用户,实际用户的问题,参考: http://www.cnblogs.com/kunhu/p/3699883.html 内核对进程存取文件的许可检查,是通过考查进程的有效用户ID来实现的的. 在 ...

  9. Openwrt WiFi Configure(1)

    1      Scope of Document This document describes how to custom wifi option 2      Requiremen 2.1     ...

  10. SQL Server 调优系列进阶篇 - 深入剖析统计信息

    前言 经过前几篇的分析,其实大体已经初窥到SQL Server统计信息的重要性了,所以本篇就要祭出这个神器了. 该篇内容会很长,坐好板凳,瓜子零食之类... 不废话,进正题 技术准备 数据库版本为SQ ...