洛谷P2023 [AHOI2009]维护序列
来源:互联网 发布:dom编程艺术第二版txt 编辑:程序博客网 时间:2024/06/05 06:43
题目描述
老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为N的数列,不妨设为a1,a2,…,aN 。有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。
输入输出格式
输入格式:第一行两个整数N和P(1≤P≤1000000000)。第二行含有N个非负整数,从左到右依次为a1,a2,…,aN, (0≤ai≤1000000000,1≤i≤N)。第三行有一个整数M,表示操作总数。从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作1:“1 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai×c (1≤t≤g≤N,0≤c≤1000000000)。 操作2:“2 t g c”(不含双引号)。表示把所有满足t≤i≤g的ai改为ai+c (1≤t≤g≤N,0≤c≤1000000000)。 操作3:“3 t g”(不含双引号)。询问所有满足t≤i≤g的ai的和模P的值 (1≤t≤g≤N)。 同一行相邻两数之间用一个空格隔开,每行开头和末尾没有多余空格。
输出格式:对每个操作3,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。
输入输出样例
7 431 2 3 4 5 6 751 2 5 53 2 42 3 7 93 1 33 4 7
2358
说明
【样例说明】
初始时数列为(1,2,3,4,5,6,7)。
经过第1次操作后,数列为(1,10,15,20,25,6,7)。
对第2次操作,和为10+15+20=45,模43的结果是2。
经过第3次操作后,数列为(1,10,24,29,34,15,16}
对第4次操作,和为1+10+24=35,模43的结果是35。
对第5次操作,和为29+34+15+16=94,模43的结果是8。
测试数据规模如下表所示
数据编号 1 2 3 4 5 6 7 8 9 10
N= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
M= 10 1000 1000 10000 60000 70000 80000 90000 100000 100000
Source: Ahoi 2009
典型的线段树,手推一下 区间乘 的计算式,写成代码即可。。。
附代码:
#include<iostream>#include<algorithm>#include<stdio.h>#define LSON rt<<1#define RSON rt<<1|1#define DATA(x) a[x].data#define LSIDE(x) a[x].l#define RSIDE(x) a[x].r#define SIGN(x) a[x].c#define PRO(x) a[x].v#define WIDTH(x) (RSIDE(x)-LSIDE(x)+1)#define MAXN 100010using namespace std;long long n,m,p;struct node{ long long data,c,v; int l,r;}a[MAXN<<2];inline long long read(){ long long date=0,w=1;char c=0; while(c!='-'&&(c<'0'||c>'9'))c=getchar(); if(c=='-'){w=-1;c=getchar();} while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();} return date*w;}void pushup(int rt){ DATA(rt)=(DATA(LSON)+DATA(RSON))%p;}void pushdown(int rt){ PRO(LSON)=(PRO(LSON)*PRO(rt))%p; SIGN(LSON)=(SIGN(LSON)*PRO(rt)+SIGN(rt))%p; DATA(LSON)=(SIGN(rt)*WIDTH(LSON)%p+DATA(LSON)*PRO(rt)%p)%p; PRO(RSON)=(PRO(RSON)*PRO(rt))%p; SIGN(RSON)=(SIGN(RSON)*PRO(rt)+SIGN(rt))%p; DATA(RSON)=(SIGN(rt)*WIDTH(RSON)%p+DATA(RSON)*PRO(rt)%p)%p; SIGN(rt)=0; PRO(rt)=1;}void buildtree(int l,int r,int rt){ int mid; LSIDE(rt)=l; RSIDE(rt)=r; SIGN(rt)=0; PRO(rt)=1; if(l==r){ DATA(rt)=read(); return; } mid=l+r>>1; buildtree(l,mid,LSON); buildtree(mid+1,r,RSON); pushup(rt);}void update1(int l,int r,long long c,int rt){ int mid; if(l<=LSIDE(rt)&&RSIDE(rt)<=r){ DATA(rt)=DATA(rt)*c%p; SIGN(rt)=SIGN(rt)*c%p; PRO(rt)=PRO(rt)*c%p; return; } pushdown(rt); mid=LSIDE(rt)+RSIDE(rt)>>1; if(l<=mid)update1(l,r,c,LSON); if(mid<r)update1(l,r,c,RSON); pushup(rt);}void update2(int l,int r,long long c,int rt){ int mid; if(l<=LSIDE(rt)&&RSIDE(rt)<=r){ SIGN(rt)=(SIGN(rt)+c)%p; DATA(rt)=(DATA(rt)+c*WIDTH(rt))%p; return; } pushdown(rt); mid=LSIDE(rt)+RSIDE(rt)>>1; if(l<=mid)update2(l,r,c,LSON); if(mid<r)update2(l,r,c,RSON); pushup(rt);}long long query(int l,int r,int rt){ int mid; long long ans=0; if(l<=LSIDE(rt)&&RSIDE(rt)<=r) return DATA(rt)%p; pushdown(rt); mid=LSIDE(rt)+RSIDE(rt)>>1; if(l<=mid)ans=(ans+query(l,r,LSON))%p; if(mid<r)ans=(ans+query(l,r,RSON))%p; return ans;}int main(){ int f,x,y; long long k; n=read();p=read(); buildtree(1,n,1); m=read(); while(m--){ f=read();x=read();y=read(); if(f==1){ k=read(); update1(x,y,k,1); } if(f==2){ k=read(); update2(x,y,k,1); } if(f==3) printf("%lld\n",query(x,y,1)%p); } return 0;}
- 洛谷P2023 [AHOI2009]维护序列
- [P2023][AHOI2009]维护序列
- [洛谷luogu] P2023 [AHOI2009]维护序列
- 【bzoj1798】【洛谷P2023】【AHOI2009】维护序列
- BZOJ1798 洛谷P2023 [AHOI2009]维护序列
- 洛谷P2023 [AHOI2009]维护序列 (BZOJ1798)
- 洛谷P2023 && bzoj1798 [AHOI2009]维护序列
- 洛谷 P2023 [AHOI2009]维护序列(bzoj P1798 [Ahoi2009]Seq 维护序列seq)
- P2023 [AHOI2009]维护序列 --线段树
- bzoj1798【ahoi2009】维护序列
- 【AHOI2009】bzoj1798 维护序列
- 【BZOJ1798】【AHOI2009】维护序列
- [AHOI2009]维护序列
- 【bzoj 1798】[AHOI2009]维护序列
- [Ahoi2009]Seq 维护序列seq
- [Ahoi2009]Seq 维护序列seq
- jzoj P1663【AHOI2009】维护序列
- [BZOJ3146][AHOI2009]维护序列seq
- 2017-10-20 1周5次课
- Oracle imp导入时乱码
- 用jsp返回json
- Java基础概念
- 对象存储系统概念
- 洛谷P2023 [AHOI2009]维护序列
- 一分钟修改网页中的内容
- leetcode经典题目及解法记录
- matlab cell
- skynet 学习笔记
- 5、上卷下拉效果--动画篇
- LL(1)文法
- github----向开源框架提交pr的过程
- Codeforces Round #441 (Div. 1, by Moscow Team Olympiad) F. Royal Questions