题意

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为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. arcgis for silverlight 地图放大到某个点或者几何对象

    http://blog.csdn.net/xuan444150/article/details/7727866   分类: silverlight王国 GIS王国 2012-07-09 08:50 1 ...

  2. WPF PasswordBox.Password 的数据绑定

    WPF的PasswordBox控件的Password属性不是依赖属性,无法直接进行数据绑定,为使其在MVVM模式中正常使用,可以为PasswordBox增加一个助手类,代码如下: 注:代码摘自:htt ...

  3. android--------Android Studio常见问题以及解决方式

    gradle build的时候出现的问题: Error:Execution failed for task ':app:packageDebug'. Duplicate files copied in ...

  4. java.lang.UnsupportedClassVersionError: com/my/test/TestUser : Unsupported major.minor version 52.0

    问题原因: 1.执行代码的jdk版本 低于 编译的jdk版本 2.项目用JDK1.8运行过,现在又在本地的eclipse等开发工具或者本地环境变量为低版本的jdk1.7或者jdk1.6下运行,ecli ...

  5. HDU-4856 Tunnels (BFS+状压DP)

    Problem Description Bob is travelling in Xi’an. He finds many secret tunnels beneath the city. In hi ...

  6. IDEA2017安装actibpmn插件中文乱码问题解决

    1.修改idea安装目录下的两个文件 C:\Program Files\JetBrains\IntelliJ IDEA 2017.1.4\bin\idea.exe.vmoptions C:\Progr ...

  7. Data Guard Wait Events

    This note describes the wait events that monitor the performance of the log transport modes that wer ...

  8. redis中的"HashMap"

    redis是一个存储键值对的内存数据库,其存储键值的方式和java中的HashMap相似. 表征redis数据库的结构体是redisDb (在server.h文件中),redis服务器默认有16个数据 ...

  9. UVALive 5984

    题目链接:Save the Students! #include<stdio.h> #include<string.h> #include<iostream> #i ...

  10. Awk 从入门到放弃(4) — Aws 格式化

    转:http://www.zsythink.net/archives/1421 print & printf的区别:printf不带\r\n 在awk当中,格式替换符的数量必须与传入的参数的数 ...