题意:

有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式:N<=1e5
(1)把数列中的一段数全部乘一个值;
(2)把数列中的一段数全部加一个值;
(3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。

思路:

线段树,因为有可能存在,同时加和乘,所以lazy标记变为二维,一个记录乘,一个记录加

因为乘是总和乘一个数,所以先乘再加,这里需要注意,因为原本的区间和可能是zhi+lazy【加】,乘是总体,所以标记lazy【加】也要乘

 il void pushdown(int x,ll mod,int l,int r){
if(lazy[x][]!=){
tree[x<<]*=lazy[x][];tree[x<<]%=mod;
tree[x<<|]*=lazy[x][];tree[x<<|]%=mod;
lazy[x<<][]*=lazy[x][];lazy[x<<][]%=mod;
lazy[x<<|][]*=lazy[x][];lazy[x<<|][]%=mod;
lazy[x<<][]*=lazy[x][];lazy[x<<][]%=mod;
lazy[x<<|][]*=lazy[x][];lazy[x<<|][]%=mod;
lazy[x][]=;
}
if(lazy[x][]!=){
int mid=(l+r)>>;
tree[x<<]+=(mid-l+)*lazy[x][];tree[x<<]%=mod;
tree[x<<|]+=(r-mid)*lazy[x][];tree[x<<|]%=mod;
lazy[x<<][]+=lazy[x][];lazy[x<<][]%=mod;
lazy[x<<|][]+=lazy[x][];lazy[x<<|][]%=mod;
lazy[x][]=;
}
}

pushdown操作

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define it register int
#define inf 0x3f3f3f3f
#define lowbit(x) (x)&(-x)
#define mem(a,b) memset(a,b,sizeof(a))
#define modd 998244353
const int maxn=2e5+;
int n,m,k;
ll p;
ll tree[maxn<<],lazy[maxn<<][],a[maxn];
il void pushdown(int x,ll mod,int l,int r){
if(lazy[x][]!=){
tree[x<<]*=lazy[x][];tree[x<<]%=mod;
tree[x<<|]*=lazy[x][];tree[x<<|]%=mod;
lazy[x<<][]*=lazy[x][];lazy[x<<][]%=mod;
lazy[x<<|][]*=lazy[x][];lazy[x<<|][]%=mod;
lazy[x<<][]*=lazy[x][];lazy[x<<][]%=mod;
lazy[x<<|][]*=lazy[x][];lazy[x<<|][]%=mod;
lazy[x][]=;
}
if(lazy[x][]!=){
int mid=(l+r)>>;
tree[x<<]+=(mid-l+)*lazy[x][];tree[x<<]%=mod;
tree[x<<|]+=(r-mid)*lazy[x][];tree[x<<|]%=mod;
lazy[x<<][]+=lazy[x][];lazy[x<<][]%=mod;
lazy[x<<|][]+=lazy[x][];lazy[x<<|][]%=mod;
lazy[x][]=;
}
}
il void pushup(int x,ll mod){
tree[x]=(tree[x<<]+tree[x<<|])%mod;
}
void build(int x,int l,int r,ll mod){
lazy[x][]=;lazy[x][]=;
if(l==r){
tree[x]=a[l];return;
}
int mid=(l+r)>>;
build(x<<,l,mid,mod);
build(x<<|,mid+,r,mod);
pushup(x,mod);
}
void updatej(int x,int l,int r,int l1,int r1,ll zhi,ll mod){
if(l1<=l && r<=r1){
pushdown(x,mod,l,r);
lazy[x][]=zhi;tree[x]+=(ll)(r-l+)*zhi;tree[x]%=mod;
return;
}
pushdown(x,mod,l,r);
int mid=(l+r)>>;
if(l1<=mid){
updatej(x<<,l,mid,l1,r1,zhi,mod);
}
if(r1>mid){
updatej(x<<|,mid+,r,l1,r1,zhi,mod);
}
pushup(x,mod);
}
void updatec(int x,int l,int r,int l1,int r1,ll zhi,ll mod){
if(l1<=l && r<=r1){
pushdown(x,mod,l,r);
lazy[x][]=zhi;tree[x]*=zhi;tree[x]%=mod;
return;
}
pushdown(x,mod,l,r);
int mid=(l+r)>>;
if(l1<=mid){
updatec(x<<,l,mid,l1,r1,zhi,mod);
}
if(r1>mid){
updatec(x<<|,mid+,r,l1,r1,zhi,mod);
}
pushup(x,mod);
}
ll query(int x,int l,int r,int l1,int r1,ll mod){
if(l1<=l && r<=r1){
return tree[x];
}
pushdown(x,mod,l,r);
int mid=(l+r)>>;
ll sum=;
if(l1<=mid){
sum+=query(x<<,l,mid,l1,r1,mod);sum%=mod;
}
if(r1>mid){
sum+=query(x<<|,mid+,r,l1,r1,mod);sum%mod;
}
return sum%mod;
}
int main(){
scanf("%d%lld",&n,&p);
for(it i=;i<=n;i++){
scanf("%lld",&a[i]);a[i]%=p;
}
build(,,n,p); scanf("%d",&m);
while(m--){//cout<<tree[1]<<endl;
int t,g;
ll c;
scanf("%d",&k);
if(k==){
scanf("%d%d%lld",&t,&g,&c);
updatec(,,n,t,g,c%p,p);
}
else if(k==){
scanf("%d%d%lld",&t,&g,&c);
updatej(,,n,t,g,c%p,p);
}
else{
scanf("%d%d",&t,&g);
printf("%lld\n",query(,,n,t,g,p));
}
}
return ;
}

这题也wa了好多遍,直到最后相通了,当加和乘同时存在的时候

P2023 [AHOI2009]维护序列 区间加乘模板的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)

    洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...

  8. [P2023][AHOI2009]维护序列(线段树)

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

  9. 【luogu P2023 [AHOI2009]维护序列】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2023 把P3373改一改直接粘过来就A #include <iostream> #include ...

随机推荐

  1. windows上快速新建1g的文件

    在E盘新建1g文件 fsutil file createnew d:\b.txt 1073741824

  2. 理解 Oracle 多租户体系中(12c,18c,19c)创建用户作用域范围

    本篇探讨以下几个问题:你可提前猜测下面6个场景语句中,哪几个可以成功创建用户? 1. 在CDB级别中创建公共用户,不带 container 子句的效果: 2. 在CDB级别中创建公共用户,带 cont ...

  3. SMTS Silicon Design Engineer Location: Beijing, Beijing, CN

    https://jobs.amd.com/job/Beijing-Physical-Design-Engineer-Beij/603603700/?locale=en_US What you do a ...

  4. python3运行调用htmltestrunner时,报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0

    之前解决过一次,又忘了,这次写下来了..百度没有的,跟我环境有关! 环境:自动化运行环境python3.6.5 上期说到了,写了一个bat来运行runallcase.py. 但是双击运行却报错:Uni ...

  5. mybatis(三):框架结构

  6. Centos7部署jenkins

    1.       下载rpm包: a)         下载地址:https://pkg.jenkins.io/redhat-stable/ b)         点选一个下载即可,例如点选:“jen ...

  7. [ZJOI2014] 力 - 多项式乘法 FFT

    题意:给定 \({q_i}\),求 \[E_i = \sum_{i<j}{\frac{q_j}{(j-i)^2}} - \sum_{i>j}{\frac{q_j}{(j-i)^2}}\] ...

  8. Linux命令 sleep 延迟

    用途说明 sleep命令常用于在Linux shell脚本中延迟时间 常用方式 注意:以下用法中<n>可以为小数. 格式:sleep <n> 格式:sleep <n> ...

  9. 【metasploit教程】之建立数据库

    在我们通过search命令搜索时,我们会发现搜索的很慢(慢搜索)而且会报错: 启动postgresql: service postgresql strart 启动metasploit会开始建立数据表: ...

  10. 【转载】Hive vs HBase

    转自:http://www.chinastor.com/a/hbase/0G3Z532014.html Hive是什么? Apache Hive是一个构建于Hadoop(分布式系统基础架构)顶层的数据 ...