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

题目链接:https://www.luogu.org/problemnew/show/P2023

把P3373改一改直接粘过来就A

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cstring>
  5 #define lson left, mid, rt<<1
  6 #define rson mid+1, right, rt<<1|1
  7 #define ll long long
  8 using namespace std;
  9 const int maxn = 100010;
 10 ll n, m, addlazy[maxn<<2], mullazy[maxn<<2], ans[maxn<<2], mod, x,y,k;
 11 void PushUP(ll rt)
 12 {
 13     ans[rt] = (ans[rt<<1] + ans[rt<<1|1])%mod;
 14 }
 15 void build(ll left, ll right, ll rt)
 16 {
 17     addlazy[rt] = 0;
 18     mullazy[rt] = 1;
 19     if(right == left)
 20     {
 21         scanf("%d",&ans[rt]);
 22         return ;
 23     }
 24     ll mid = (left+right) >> 1;
 25     build(lson);
 26     build(rson);
 27     PushUP(rt);
 28 }
 29 void PushDOWN(ll rt, ll mid, ll left, ll right)
 30 {
 31         mullazy[rt<<1]=(mullazy[rt<<1]*mullazy[rt])%mod;
 32         mullazy[rt<<1|1]=(mullazy[rt<<1|1]*mullazy[rt])%mod;
 33         addlazy[rt<<1]=(addlazy[rt<<1]*mullazy[rt])%mod;
 34         addlazy[rt<<1|1]=(addlazy[rt<<1|1]*mullazy[rt])%mod;
 35         ans[rt<<1]=(ans[rt<<1]*mullazy[rt])%mod;
 36         ans[rt<<1|1]=(ans[rt<<1|1]*mullazy[rt])%mod;
 37         mullazy[rt]=1;
 38         addlazy[rt<<1]=(addlazy[rt<<1]+addlazy[rt])%mod;
 39         addlazy[rt<<1|1]=(addlazy[rt<<1|1]+addlazy[rt])%mod;
 40         ans[rt<<1]=(ans[rt<<1]+(mid-left+1)*addlazy[rt])%mod;
 41         ans[rt<<1|1]=(ans[rt<<1|1]+(right-mid)*addlazy[rt])%mod;
 42         addlazy[rt]=0;
 43 }
 44 void mulupdate(ll l, ll r, ll add, ll left, ll right, ll rt)
 45 {
 46     if(l<=left&&r>=right)
 47     {
 48         addlazy[rt] = (addlazy[rt]*add)%mod;
 49         mullazy[rt] = (mullazy[rt]*add)%mod;
 50         ans[rt] = (add*ans[rt])%mod;
 51         return;
 52     }
 53     ll mid = (left+right)>>1;
 54     if(mullazy[rt]!=1||addlazy[rt]>=1) PushDOWN(rt,mid,left,right);
 55     if(l<=mid) mulupdate(l,r,add,lson);
 56     if(r>mid)  mulupdate(l,r,add,rson);
 57     PushUP(rt);
 58 }
 59 void addupdate(ll l, ll r, ll add, ll left, ll right, ll rt)
 60 {
 61     if(l<=left&&r>=right)
 62     {
 63         addlazy[rt]= (addlazy[rt]+add)%mod;
 64         ans[rt] = (ans[rt] + add*(right-left+1))%mod;
 65         return;
 66     }
 67     ll mid = (left+right)>>1;
 68     if(mullazy[rt]!=1||addlazy[rt]>=1) PushDOWN(rt,mid,left,right);
 69     if(l<=mid) addupdate(l,r,add,lson);
 70     if(r>mid)  addupdate(l,r,add,rson);
 71     PushUP(rt);
 72 }
 73 ll query(ll l, ll r, ll left, ll right, ll rt)
 74 {
 75     ll res = 0;
 76     if(l <= left&&r >= right) return ans[rt]%mod;
 77     ll mid = (left+right) >> 1;
 78     if(mullazy[rt]!=1||addlazy[rt]>=1) PushDOWN(rt, mid, left, right);
 79     if(l <= mid) res = (res+query(l,r,lson))%mod;
 80     if(r > mid) res = (res+query(l,r,rson))%mod;
 81     return res%mod;
 82 }
 83 int main()
 84 {
 85     scanf("%d%d",&n,&mod);
 86     build(1,n,1);
 87     scanf("%d",&m);
 88     while(m--)
 89     {
 90         int p;
 91         scanf("%d",&p);
 92         if(p == 1)
 93         {
 94             scanf("%d%d%d",&x,&y,&k);
 95             mulupdate(x,y,k,1,n,1);
 96         }
 97         if(p == 2)
 98         {
 99             scanf("%d%d%d",&x,&y,&k);
100             addupdate(x,y,k,1,n,1);
101         }
102         if(p == 3)
103         {
104             scanf("%d%d",&x,&y);
105             printf("%d\n",query(x,y,1,n,1));
106         }
107     }
108     return 0;
109 }

原文地址:https://www.cnblogs.com/MisakaAzusa/p/8763141.html

时间: 2024-10-14 09:47:23

【luogu P2023 [AHOI2009]维护序列】 题解的相关文章

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

题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这篇题解. (详情见代码注释) AC代码 #include<stdio.h> #define min(a,b) (a>b?b:a) #define max(a,b) (a>b?a:b) typedef long long ll; int n,m; ll mod,k,a[500010];

Luogu P2023 [AHOI2009]维护序列

题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 输入输出格式 输入格式: 第一行两个整数N和P(1≤P≤1000000000).第二行含有N个非负整数,从左到右依次为 a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N).第三行有一个

洛谷 P2023 [AHOI2009]维护序列

P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 输入输出格式 输入格式: 第一行两个整数N和P(1≤P≤1000000000). 第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤100

P2023 [AHOI2009]维护序列 (线段树区间修改查询)

题目链接:https://www.luogu.org/problemnew/show/P2023 一道裸的线段树区间修改题,懒惰数组注意要先乘后加 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxx = 400010; LL tree[maxx],lazy1[maxx],lazy2[maxx],a[maxx],mod; int n; void build(int l,int r,in

P2023 [AHOI2009] 维护序列(线段树水题)

题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 输入输出格式 输入格式: 第一行两个整数N和P(1≤P≤1000000000).第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N).第三行有一个整

P2023 [AHOI2009]维护序列 --线段树

题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 输入输出格式 输入格式: 第一行两个整数N和P(1≤P≤1000000000).第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N).第三行有一个整

P2023 [AHOI2009]维护序列

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. 输入输出格式 输入格式: 第一行两个整数N和P(1≤P≤1000000000).第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N).第三行有一个整数M,表示

P3373 线段树乘法模板 P2023 [AHOI2009]维护序列

题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上x 2.将某区间每一个数加上x 3.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含三个整数N.M.P,分别表示该数列数字的个数.操作的总个数和模数. 第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值. 接下来M行每行包含3或4个整数,表示一个操作,具体如下: 操作1: 格式:1 x y k 含义:将区间[x,y]内每个数乘上k 操作2: 格式:2 x y k 含义:将区间[x,y]内

BZOJ1798题解 Seq维护序列题解 双tag裸线段树

BZOJ1798题解 Seq维护序列题解 双tag裸线段树 1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5549  Solved: 1951[Submit][Status][Discuss] Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)