【题目链接】

  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. QEvent大全,有中文解释

    简述 QEvent 类是所有事件类的基类,事件对象包含事件参数. Qt 的主事件循环(QCoreApplication::exec())从事件队列中获取本地窗口系统事件,将它们转化为 QEvents, ...

  2. Haxe - Actuate.Tween

    方法解释: Actuate.tween( target : Dynamic , duration : Float , properties : Dynamic , ?overwrite : Bool ...

  3. ubuntu 映射网络驱动器到本地

    公司办公都是在ubuntu服务器上,所以每每拷贝修改文件都要ftp之类的,实在不方便. 索性将服务器挂载到自己本地目录下. 服务器端参考其他samba安装和配置.这里只是说下本地自动挂载方法. 一.首 ...

  4. Ubuntu链接ubuntu服务器

    以前在windows下用ssh工具putty连接 linux服务器, 很简单,在linux下要连接linux的服务器, 找了下,果然putty在linux中也行1,sudo apt-get insta ...

  5. struct dev_t

    device number(dev_t) linux driver 2009-08-21 10:08:03 阅读26 评论0 字号:大中小 dev_t description:     the dev ...

  6. WCf的理解

    从 .NET 3.5 开始 WCF 已经支持用 WebHttpBinding 构建 RESTful Web 服务,基于 WCF 框架的 RESTful Web 服务还是建立在 WCF Message ...

  7. 如何使用UIAutomation进行iOS 自动化测试(Part I)

    转自:http://www.cnblogs.com/vowei/archive/2012/08/10/2631949.html 写在前面 研究iOS的自动化测试也有些日子了,刚开始的时候,一直苦于找不 ...

  8. Qt之启动外部程序

    简述 QProcess可以用来启动外部程序,并与它们交互. 要启动一个进程,通过调用start()来进行,参数包含程序的名称和命令行参数,参数作为一个QStringList的单个字符串. 另外,也可以 ...

  9. 从MySpace基于.NET平台的六次重构经历感受分布式

    它们拥有的用户和fans之多,大家都很清楚. Myspace是一个基于.NET平台的,而Facebook更多是基于LAMP的.我们来看看MySpace配合.NET+Windows Server 200 ...

  10. 转:MVC 下导航超链接本页面高亮的一种解决方案

    前言 导航高亮一直是一个让大家头疼的问题. 纯 Javascript 的话可以判断当前页面的地址和链接地址是否有关系. 这样的弊端就是自由度太低,MVC 下会出一定的问题 (MVC 下有默认的 Con ...