[BZOJ1798][AHOI2009]Seq维护序列 线段树
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798
一眼看过去线段树,事实上就是线段树。对于乘和加的两个标记,我们可以规定一个顺序,比如先乘后加。每次乘的时候利用乘法分配律就可以分别更新标记,而加就直接加上去就好了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int inline readint(){
int Num;char ch;
while((ch=getchar())<''||ch>'');Num=ch-'';
while((ch=getchar())>=''&&ch<='') Num=Num*+ch-'';
return Num;
}
void outint(int x){
if(x>=) outint(x/);
putchar(x%+'');
}
int N,M,P;
int sum[(<<)+],col1[(<<)+],col2[(<<)+];
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
void Pushup(int &rt){
sum[rt]=(sum[rt<<]+sum[rt<<|])%P;
}
void Build(int l,int r,int rt){
col1[rt]=;
if(l==r){
sum[rt]=readint()%P;
return;
}
int mid=l+r>>;
if(l<=mid) Build(lson);
if(r>mid) Build(rson);
Pushup(rt);
}
void Pushdown(int &rt,int &l,int &r){
if(col1[rt]!=){
col1[rt<<]=(ll)col1[rt<<]*col1[rt]%P;
col2[rt<<]=(ll)col2[rt<<]*col1[rt]%P;
sum[rt<<]=(ll)sum[rt<<]*col1[rt]%P;
col1[rt<<|]=(ll)col1[rt<<|]*col1[rt]%P;
col2[rt<<|]=(ll)col2[rt<<|]*col1[rt]%P;
sum[rt<<|]=(ll)sum[rt<<|]*col1[rt]%P;
col1[rt]=;
}
if(col2[rt]){
col2[rt<<]=(col2[rt<<]+col2[rt])%P;
sum[rt<<]=((ll)col2[rt]*((l+r>>)-l+)%P+sum[rt<<])%P;
col2[rt<<|]=(col2[rt<<|]+col2[rt])%P;
sum[rt<<|]=((ll)col2[rt]*(r-(l+r>>))%P+sum[rt<<|])%P;
col2[rt]=;
}
}
void Mul(int l,int r,int rt,int L,int R,int x){
if(l>=L&&r<=R){
col1[rt]=(ll)col1[rt]*x%P;
col2[rt]=(ll)col2[rt]*x%P;
sum[rt]=(ll)sum[rt]*x%P;
return;
}
Pushdown(rt,l,r);
int mid=l+r>>;
if(L<=mid) Mul(lson,L,R,x);
if(R>mid) Mul(rson,L,R,x);
Pushup(rt);
}
void Add(int l,int r,int rt,int L,int R,int x){
if(l>=L&&r<=R){
col2[rt]=(col2[rt]+x)%P;
sum[rt]=((ll)(r-l+)*x%P+sum[rt])%P;
return;
}
Pushdown(rt,l,r);
int mid=l+r>>;
if(L<=mid) Add(lson,L,R,x);
if(R>mid) Add(rson,L,R,x);
Pushup(rt);
}
int Qry(int l,int r,int rt,int L,int R){
if(l>=L&&r<=R) return sum[rt];
Pushdown(rt,l,r);
int mid=l+r>>,ret=;
if(L<=mid) ret=Qry(lson,L,R);
if(R>mid) ret=(ret+Qry(rson,L,R))%P;
return ret;
}
int main(){
N=readint();
P=readint();
Build(,N,);
M=readint();
for(int i=;i<=M;i++){
int opt=readint(),t,g,c;
switch(opt){
case :
t=readint();
g=readint();
c=readint()%P;
Mul(,N,,t,g,c);
break;
case :
t=readint();
g=readint();
c=readint()%P;
Add(,N,,t,g,c);
break;
case :
t=readint();
g=readint();
outint(Qry(,N,,t,g));
putchar('\n');
break;
}
}
return ;
}
[BZOJ1798][AHOI2009]Seq维护序列 线段树的更多相关文章
- BZOJ 1798 AHOI2009 Seq 维护序列 线段树
题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- [bzoj1798][Ahoi2009]Seq 维护序列seq ([洛谷P3373]【模板】线段树 2)
题目大意:有$n$个数,有$m$个操作,有三种: $1\;l\;r\;x:$把区间$[l,r]$内的数乘上$x$ $2\;l\;r\;x:$把区间$[l,r]$内的数加上$x$ $3\;l\;r:$询 ...
- BZOJ1798[Ahoi2009]Seq 维护序列seq 题解
题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...
- 【AHOI2009】 维护序列 - 线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq
传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...
- BZOJ1798——[Ahoi2009]Seq维护序列seq
1.题目大意:区间修改乘法操作和加法操作,求区间和 2.分析:为了填补bzoj2631的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...
- 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq
分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
随机推荐
- How to Use SFTP ?
Usage Build a SFTP session with your linux like server, e.g, by the tool "Xshell" or any y ...
- SSH三大框架整合配置详细步骤(3)
5 配置Spring2.5 5.1 基础配置 1) 导入spring包.下载spring-framework-2.5.6并解压后,在spring-framework-2.5.6" ...
- H5的localStorage简单存储删除
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- XMU 1613 刘备闯三国之三顾茅庐(一) 【并查集】
1613: 刘备闯三国之三顾茅庐(一) Time Limit: 1000 MS Memory Limit: 128 MBSubmit: 99 Solved: 29[Submit][Status][ ...
- POJ1733 Parity game —— 种类并查集
题目链接:http://poj.org/problem?id=1733 Parity game Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- 全局Timestamp管理器 检测js执行时间
随手写了个小工具,主要为了测试不同混淆程度的javascript脚本的加载速度1. [代码]Timestamp.js (function() { if (typeof this.Timestamp = ...
- lucene 索引文件大小分布_tim
Hi, I have index ~31G where27% of the index size is .fdt files (8.5G)20% - .fdx files (6.2G)37% - .f ...
- gunicorn部署Flask服务
作为一个Python选手,工作中需要的一些服务接口一般会用Flask来开发. Flask非常容易上手,它自带的app.run(host="0.0.0.0", port=7001)用 ...
- bzoj 1086 王室联邦 —— 思路题
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1086 一眼看去很是不会,于是看看TJ... https://blog.csdn.net/ly ...
- Mediaproxy 与 Rtpproxy
Mediaproxy: Mediaproxy是Opensips的一个模块,它用来实现现有大多数sip客户端的自动NAT穿透.这就意味着,当使用mediaproxy模块时,不需要对NAT盒子进行任何配置 ...