题目描述

老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成。 有长为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,按照它在输入中出现的顺序,依次输出一行一个整数表示询问结果。

输入输出样例

输入样例#1: 复制

7 43
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7
输出样例#1: 复制

2
35
8

说明

【样例说明】

初始时数列为(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<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 100001
using namespace std;
struct nond{
long long l,r,sum;
long long flag1,falg2;
}tree[MAXN*];
long long n,m,p;
void up(long long now){
tree[now].sum=(tree[now*].sum+tree[now*+].sum)%p;
}
void build(long long now,long long l,long long r){
tree[now].l=l;tree[now].r=r;
tree[now].flag1=;tree[now].falg2=;
if(tree[now].l==tree[now].r){
scanf("%d",&tree[now].sum);
return ;
}
long long mid=(tree[now].l+tree[now].r)/;
build(now*,l,mid);
build(now*+,mid+,r);
up(now);
}
void down(long long now){
if(tree[now].flag1!=){
tree[now*].flag1=tree[now*].flag1*tree[now].flag1%p;
tree[now*].falg2=tree[now*].falg2*tree[now].flag1%p;
tree[now*].sum=tree[now*].sum*tree[now].flag1%p;
tree[now*+].flag1=tree[now*+].flag1*tree[now].flag1%p;
tree[now*+].falg2=tree[now*+].falg2*tree[now].flag1%p;
tree[now*+].sum=tree[now*+].sum*tree[now].flag1%p;
tree[now].flag1=;
}
if(tree[now].falg2){
tree[now*].falg2=(tree[now*].falg2+tree[now].falg2)%p;
tree[now*+].falg2=(tree[now*+].falg2+tree[now].falg2)%p;
tree[now*].sum=(tree[now*].sum+(tree[now*].r-tree[now*].l+)*tree[now].falg2%p)%p;
tree[now*+].sum=(tree[now*+].sum+(tree[now*+].r-tree[now*+].l+)*tree[now].falg2%p)%p;
tree[now].falg2=;
}
}
void changechen(long long now,long long l,long long r,long long k){
if(tree[now].l==l&&tree[now].r==r){
tree[now].sum=tree[now].sum*k%p;
tree[now].flag1=tree[now].flag1*k%p;
tree[now].falg2=tree[now].falg2*k%p;
return ;
}
if(tree[now].flag1!=||tree[now].falg2) down(now);
long long mid=(tree[now].l+tree[now].r)/;
if(r<=mid) changechen(now*,l,r,k);
else if(l>mid) changechen(now*+,l,r,k);
else{
changechen(now*,l,mid,k);
changechen(now*+,mid+,r,k);
}
up(now);
}
void changeadd(long long now,long long l,long long r,long long k){
if(tree[now].l==l&&tree[now].r==r){
tree[now].sum=(tree[now].sum+(tree[now].r-tree[now].l+)*k%p)%p;
tree[now].falg2=(tree[now].falg2+k)%p;
return ;
}
if(tree[now].flag1!=||tree[now].falg2) down(now);
long long mid=(tree[now].l+tree[now].r)/;
if(r<=mid) changeadd(now*,l,r,k);
else if(l>mid) changeadd(now*+,l,r,k);
else{
changeadd(now*,l,mid,k);
changeadd(now*+,mid+,r,k);
}
up(now);
}
long long query(long long now,long long l,long long r){
if(tree[now].l==l&&tree[now].r==r)
return tree[now].sum%p;
if(tree[now].flag1!=||tree[now].falg2) down(now);
long long mid=(tree[now].l+tree[now].r)/;
if(r<=mid) return query(now*,l,r);
else if(l>mid) return query(now*+,l,r);
else return (query(now*,l,mid)+query(now*+,mid+,r))%p;
}
int main(){
scanf("%lld%lld",&n,&p);
build(,,n);scanf("%lld",&m);
for(long long i=;i<=m;i++){
long long opt,x,y,k;
scanf("%lld%lld%lld",&opt,&x,&y);
if(opt==){
scanf("%lld",&k);
changechen(,x,y,k);
}
else if(opt==){
scanf("%lld",&k);
changeadd(,x,y,k);
}
else if(opt==) printf("%lld\n",query(,x,y)%p);
}
}

洛谷 P2023 [AHOI2009]维护序列的更多相关文章

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

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

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

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

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

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

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

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

  5. 洛谷 P2023 [AHOI2009]维护序列 || 线段树加法和乘法运算

    原理倒是非常简单.设原数为x,加法的lazytag为b,乘法的lazytag为a,操作数为c,那么原式为ax+b,乘上c后(ax+b)c=(ac)*x+b*c,加上c后(ax+b)+c=ax+(b+c ...

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

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

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

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

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

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

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

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

随机推荐

  1. ArgumentError: You need to supply at least one validatio

    创建: 2017/10/02   意思: validate没有内容 例:   validates :title

  2. Rails 拉数据初始数据库

    rails c   [1] pry(main)> Scraping.exec

  3. 湖南集训day8

    难度:☆☆☆☆☆☆☆ /* 可以先考虑一维,可知 模k意义下相同的前缀和任意两个相减都是k的倍数 问题等价于统计前缀何种模k相同的数的对数. 多维的时候二维前缀和,压行或者压列,n^3可以解决. */ ...

  4. codevs4511信息传递(Tarjan求环)

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

  5. IOS开发 键盘添加工具条 退出 上一项 下一项 简单实现

    首先设置每个 UITextField 的 inputAccessoryView 为UIToolBar : 将所有的 textField 放入一个数组: 设置 UITextField UITextFie ...

  6. 【Leetcode 166】 Fraction to Recurring Decimal

    Description: Given two integers representing the numerator and denominator of a fraction, return the ...

  7. React Native状态机和应用设计思路

    React Native状态机和应用设计思路 在原生Android开发中:当用户点击“登录”按钮时,从用户名输入框中读取用户输入的用户名,从密码输入框中读取用户输入的密码,然后交给注册模块去处理.但是 ...

  8. linux 卸载 mongo2.6

    要求:linux 卸载 mongo2.6 版本:linux系统:Ubuntu 16.04 mongo:  mongo 2.6.12 1.  查看安装的mongo版本和服务 # dpkg –l | gr ...

  9. JS高级——Function

    Function构造函数 可以用来新建函数对象 1.一个参数都不传的情况创建的就是一个空的函数 2.只传一个参数的情况这个参数就是函数体 3.传多个参数的情况,最后一个参数为函数体,前面的参数都是该函 ...

  10. iOS 9 中可用的受信任根证书列表

    iOS 受信任证书存储区包含随 iOS 预安装的可信根证书.  https://support.apple.com/zh-cn/HT205205 关于信任和证书 iOS 9 受信任证书存储区包含三类证 ...