洛谷 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,表示操作总数。 从第四行开始每行描述一个操作,输入的操作有以下三种形式: 操作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,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]维护序列的更多相关文章
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
- 洛谷 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 ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解
题目传送: P3373 [模板]线段树 2 P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
- [P2023][AHOI2009]维护序列(线段树)
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
随机推荐
- [Swift通天遁地]六、智能布局-(2)视图对象的尺寸和位置相对约束
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- 异常强大的Markdown编辑插件-Markdown Preview Enhanced
最近使用Markdown写作,了解到以下这些Markdown写作工具 MaHua 在线markdown编辑器 百度搜索Markdown时,它排在非常靠前的位置 马克飞象- 专为印象笔记打造的Markd ...
- Kafka详解与总结(五)
Kafka持久化 1. 概述 Kafka大量依赖文件系统去存储和缓存消息.对于硬盘有个传统的观念是硬盘总是很慢,这使很多人怀疑基于文件系统的架构能否提供优异的性能.实际上硬盘的快慢完全取决于使用它的方 ...
- python 画图
1.根据实际图形,用符号画出原来图形 from PIL import Image import argparse #命令行输入参数处理 parser = argparse.ArgumentParser ...
- Win10中的睡眠、休眠
共同点: 都是节能技术. 异同点: 睡眠: 需要耗电.通过键盘鼠标唤醒.唤醒速度快.将用户正在处理的数据保存到内存中,除内存以外的所有设备都停止供电. 休眠: 不需耗电.通过电源键唤醒.唤醒速度慢.将 ...
- python 之 sqlite3
# -*- coding: utf-8 -*- ''' 创建数据库日志,三列为时间 身份证号和备注名''' import os import sys import sqlite3 import dat ...
- JS——缓慢动画封装
在知道如何获取内嵌式和外链式的标签属性值之后,我们再次封装缓慢动画: 单个属性 <!DOCTYPE html> <html> <head lang="en&qu ...
- Json——转义符
C#后台直接输出Json字符串需要反斜杠“\” context.Response.Write("[{\"Name\": \"wqx\", \" ...
- dubbo之延迟暴露
延迟暴露 如果你的服务需要预热时间,比如初始化缓存,等待相关资源就位等,可以使用 delay 进行延迟暴露. 延迟 5 秒暴露服务 <dubbo:service delay="5000 ...
- Caffe2:python -m caffe2.python.operator_test.relu_op_test
1. 进行语句测试时候,出现问题, 设置环境变量CUDA_VISIBLE_DEVICES 参考: cuda设置指定可见方法 在/etc/profile文件或者-/.bashrc末尾添加以下行: exp ...