题意:

有长为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. ZOJ1310-Robot (BFS)

    The Robot Moving Institute is using a robot in their local store to transport different items. Of co ...

  2. linux命令解压压缩rar文件的详细步骤

    参考文件:https://www.cnblogs.com/qinglin/p/9007939.html

  3. bat文件一键运行python自动化脚本

    目标:建立一个双击即可运行自动化脚本的机制,而不用每次运行编译器,方便测试人员用户体验. 方法: 1. 将所有代码打包成exe文件,但一旦修改,又要重新打包. 2. 将运行代码写成bat文件,双击即执 ...

  4. P3391 【模板】文艺平衡树

    模板题 link Splay 区间翻转,存个代码 旋转时,要注意goal是引用 , 并记得修改 , 有标记的一定记得标记下放 , 还有清空 #include<iostream> #incl ...

  5. mybatis-plus - MybatisPlusAutoConfiguration

    mybatis 的通用maper, 其实有很多, mybatis-plus 算是其中做的比较好的一款了. 这里就来看一下 mybatis-plus 是怎么实现这个通用mapper功能的. 一. Bas ...

  6. 利用Marshal来管理非托管资源

    void MarshalChartDemo() { string name = "xuwei"; IntPtr pName = Marshal.AllocHGlobal(name. ...

  7. Jmeter-功能概要

    1.Jmeter工具组成部分 (1)资源生成器:用于生成测试过程中服务器.负载机的资源代码.(LR中的VuGen) (2)用户运行器:通常是一个脚本运行引擎,根据脚本要求模拟指定的用户行为.(LR中的 ...

  8. java基础(五)之static关键词的作用

    static关键词的作用 1.静态成员变量的语法特定2.静态函数的语法特定3.静态代码块的语法特定 定义静态成员变量 Person.java class Person{ static int a; } ...

  9. flask入门(二)

    接着上文 讲一讲响应 flask调用视图函数后,会将其返回值作为响应的内容.大多数情况下,响应就是一个简单的字符串,作为HTML页面回送客户端.但HTTP协议需要的不仅是作为请求响应的字符串.HTTP ...

  10. 使用正则提取字符串中URL等信息

    一.说明 背景:最近在做同步京东商品信息时遇到一个问题,同步后的商品详情无法在富文本中修改,强制修改会导致图片无法正常显示,研究发现详情中的图片是在css的作为背景图指定的. 解决:经过多次尝试,最后 ...