题目链接: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维护序列 线段树的更多相关文章

  1. BZOJ 1798 AHOI2009 Seq 维护序列 线段树

    题目大意:维护一个序列,提供三种操作: 1.将区间中每个点的权值乘上一个数 2.将区间中每个点的权值加上一个数 3.求一段区间的和对p取模的值 2631的超^n级弱化版.写2631之前能够拿这个练练手 ...

  2. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5504  Solved: 1937[Submit ...

  3. [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:$询 ...

  4. BZOJ1798[Ahoi2009]Seq 维护序列seq 题解

    题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...

  5. 【AHOI2009】 维护序列 - 线段树

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

  6. BZOJ1798: [Ahoi2009]Seq 维护序列seq

    传送门 写这道题是为了get一个同时传送乘法下标和加法下标的小技巧,线段树模板题.不多说. 标记名字打错无限智力-- //BZOJ 1798 //by Cydiater //2016.9.13 #in ...

  7. BZOJ1798——[Ahoi2009]Seq维护序列seq

    1.题目大意:区间修改乘法操作和加法操作,求区间和 2.分析:为了填补bzoj2631的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...

  8. 【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq

    分块,打标记,维护两个标记:乘的 和 加的. 每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值. 每次 区间加的时候 对 加标记 加上那个值. (ax+b)*v=axv+bv.开 long ...

  9. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

随机推荐

  1. React笔记

    React JS Tutorials for Beginners - 1 - Getting Started https://www.youtube.com/watch?v=-AbaV3nrw6E&a ...

  2. Mac下Git项目使用的.gitignore文件

    https://www.gitignore.io/ 这个网站可以搜索特定项目.系统所需要的.gitignore 我现在主要是在Mac上用Visual Studio Code进行开发,所以直接搜索Mac ...

  3. the first week study

    1.In 1989, a man named Guido create "python" as a kind of computer languages. And now we u ...

  4. 【iOS系列】- 通知NSNotification的使用

    [iOS系列]- 通知NSNotification的使用 1:属性 通知属性: - (NSString *)name; // 通知的名称 - (id)object; // 通知发布者(是谁要发布通知) ...

  5. C# MVC 枚举转 SelectListItem

    <span style="font-size: 18px; font-family: Arial, Helvetica, sans-serif; background-color: r ...

  6. 头文件与cpp文件为什么要分开写

    最表面的机制是: 头文件是程序的界面(是代码界面),提供给程序员以  类.模版.函数等一系列的声明,让程序员知道应该怎么调用里面的"东西". 从动态链接库的角度看: 头文件提供界面 ...

  7. C 项目案例实践(1)数据结构之链表(0)

    链表是通过一组任意的存储单元来存储线性表中的数据元素的,那么怎样表示出数据元素之间的线性关系呢?为建立数据元素之间的线性关系,对每个数据元素ai,除了存放数据元素的自身信息ai之外,还需要存放和ai一 ...

  8. W5500EVB UDP模式的測试与理解

    之前的博文中已经介绍过W5500EVB 在TCP模式下的两种(Server及Client)传输数据的实现过程,那么传输控制协议中,UDP也是很经常使用的.这样的无连接的协议在很多其它场合为用户提供了便 ...

  9. wpa_supplicant介绍【转】

    本文转载自:https://zhuanlan.zhihu.com/p/24246712 一.什么是wpa_spplicant wpa_supplicant本是开源项目源码,被谷歌修改后加入Androi ...

  10. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...