【题目链接】

  http://www.lydsy.com/JudgeOnline/problem.php?id=1798

【题意】

给定一个序列,要求提供区间乘/加,以及区间求和的操作

【思路】

线段树+传标。

下传标记的方式可以类比这里 click here

【代码】

 #include<set>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define trav(u,i) for(int i=front[u];i;i=e[i].nxt)
#define FOR(a,b,c) for(int a=(b);a<=(c);a++)
using namespace std; typedef long long ll;
const int N = 2e5+; ll read() {
char c=getchar();
ll f=,x=;
while(!isdigit(c)) {
if(c=='-') f=-; c=getchar();
}
while(isdigit(c))
x=x*+c-'',c=getchar();
return x*f;
} int MOD ; struct Tnode {
int u,l,r;
ll sum,add,mul;
void mulv(ll x) ;
void addv(ll x) ;
void pushdown() ;
void maintain() ;
} T[N<<] ;
void Tnode::mulv(ll x) {
mul=(mul*x)%MOD;
sum=(sum*x)%MOD;
add=(add*x)%MOD;
}
void Tnode::addv(ll x) {
sum=(sum+(r-l+)*x)%MOD;
add=(add+x)%MOD;
}
void Tnode::pushdown() {
if(mul!=) {
T[u<<].mulv(mul);
T[u<<|].mulv(mul);
mul=;
}
if(add) {
T[u<<].addv(add);
T[u<<|].addv(add);
add=;
}
}
void Tnode::maintain() {
sum=(T[u<<].sum+T[u<<|].sum)%MOD;
}
void update(int u,int L,int R,int x,int flag) {
T[u].pushdown();
if(L<=T[u].l&&T[u].r<=R) {
if(flag==) T[u].addv(x);
else T[u].mulv(x);
} else {
int mid=T[u].l+T[u].r>>;
if(L<=mid) update(u<<,L,R,x,flag);
if(mid<R) update(u<<|,L,R,x,flag);
T[u].maintain();
}
}
ll query(int u,int L,int R) {
T[u].pushdown();
if(L<=T[u].l&&T[u].r<=R)
return T[u].sum;
else {
int mid=T[u].l+T[u].r>>;
ll ans=;
if(L<=mid) ans=(ans+query(u<<,L,R))%MOD;
if(mid<R) ans=(ans+query(u<<|,L,R))%MOD;
return ans;
}
} int n,m; ll a[N]; void build(int u,int l,int r) {
T[u]=(Tnode){u,l,r,,,};
if(l==r) {
T[u].sum=a[l]%MOD;
return ;
} else {
int mid=l+r>>;
build(u<<,l,mid);
build(u<<|,mid+,r);
T[u].maintain();
}
}
/* Debug
int print(int u) {
T[u].pushdown();
if(T[u].l==T[u].r) printf("%d,%d\n",T[u].l,T[u].v);
else {
print(u<<1),print(u<<1|1);
}
}
*/
int main()
{
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
n=read(),MOD=read();
FOR(i,,n) a[i]=read();
build(,,n);
m=read();
int op,l,r,x;
FOR(i,,m) {
op=read(),l=read(),r=read();
if(op==) {
x=read();
update(,l,r,x,);
} else
if(op==) {
x=read();
update(,l,r,x,);
} else {
printf("%lld\n",query(,l,r));
}
}
return ;
}

P.S.我竟然蛋疼的存了一个v,还一本正经地累计到sum里 <_<

bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)的更多相关文章

  1. 【BZOJ1798】【AHOI2009】维护序列(线段树)

    题目链接 题解 这不就是luogu的线段树2的板子吗.... 没有任何的区别... 上代码吧... #include<iostream> #include<cstdio> #i ...

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

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

  3. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  4. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...

  5. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

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

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

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

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

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

  8. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

  9. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

随机推荐

  1. Android:密码显示隐藏

    效果: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  2. PowerDesigner连接Oracle数据库建表序列号实现自动增长

    原文:PowerDesigner连接Oracle数据库建表序列号实现自动增长 创建表就不说了.下面开始介绍设置自动增长列. 1 在表视图的列上创建.双击表视图,打开table properties — ...

  3. player/stage 学习---安装

    环境 ubuntu 14.04 一,工具安装 sudo apt-get install git cmake g++ fltk1.1-dev libjpeg8-dev libpng12-dev libg ...

  4. 各种分区类型对应的partition_Id

    ID Name Note == ==== ==== 00h empty [空] 01h DOS 12-bit FAT [MS DOS FAT12] 02h XENIX root file system ...

  5. RMI

    Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力.Java作为一种风靡一时的网络开发语言 ...

  6. mysqldump常用于MySQL数据库逻辑备份

    mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump ...

  7. int string相互转换

    一.itoa()和atoi() 注意:这两个函数并不是标准的C函数,而是windows环境下特有的函数. 1.itoa #include<iostream> #include<str ...

  8. 面试题_48_to_65_Java 集合框架的面试题

    这部分也包含数据结构.算法及数组的面试问题 48) List.Set.Map 和 Queue 之间的区别(答案)List 是一个有序集合,允许元素重复.它的某些实现可以提供基于下标值的常量访问时间,但 ...

  9. 函数os_file_pread

    /*******************************************************************//** Does a synchronous read ope ...

  10. UVa 11077 (循环分解 递推) Find the Permutations

    把{1, 2, 3,,, n}叫做自然排列 本题便是求有多少个n元排列P要至少经过k次交换才能变为自然排列. 首先将排列P看做置换,然后将其分解循环,对于每个长度为i的循环至少要交换i-1次才能归位. ...