题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798

这题还4A...

注意:cnt 从1开始;各种模 p;乘法标记初始值是 1;可能乘 0。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define mid ((l+r)>>1)
using namespace std;
typedef long long ll;
int const xn=1e5+;
int n,a[xn],cnt,ls[xn<<],rs[xn<<],sum[xn<<],lzy[xn<<],ml[xn<<],p;
int rd()
{
int ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return f?ret:-ret;
}
int upt(int x){while(x>=p)x-=p; while(x<)x+=p; return x;}
void build(int x,int l,int r)
{
ml[x]=;//
if(l==r){sum[x]=a[l]; return;}
ls[x]=++cnt; rs[x]=++cnt;
build(ls[x],l,mid); build(rs[x],mid+,r);
sum[x]=upt(sum[ls[x]]+sum[rs[x]]);
}
void turn(int x,int c){sum[x]=(ll)sum[x]*c%p; lzy[x]=(ll)lzy[x]*c%p; ml[x]=(ll)ml[x]*c%p;}
void pushdown(int x,int l,int r)
{
if(ml[x]!=)//
{
int v=ml[x]; ml[x]=;//
turn(ls[x],v); turn(rs[x],v);
}
if(lzy[x])
{
int v=lzy[x]; lzy[x]=;
sum[ls[x]]=(sum[ls[x]]+(ll)(mid-l+)*v)%p; lzy[ls[x]]=upt(lzy[ls[x]]+v);
sum[rs[x]]=(sum[rs[x]]+(ll)(r-mid)*v)%p; lzy[rs[x]]=upt(lzy[rs[x]]+v);
}
}
void mul(int x,int l,int r,int L,int R,int c)
{
if(l>=L&&r<=R){turn(x,c); return;}
pushdown(x,l,r);
if(mid>=L)mul(ls[x],l,mid,L,R,c);
if(mid<R)mul(rs[x],mid+,r,L,R,c);
sum[x]=upt(sum[ls[x]]+sum[rs[x]]);
}
void add(int x,int l,int r,int L,int R,int c)
{
if(l>=L&&r<=R){sum[x]=(sum[x]+(ll)(r-l+)*c)%p; lzy[x]=upt(lzy[x]+c); return;}
pushdown(x,l,r);
if(mid>=L)add(ls[x],l,mid,L,R,c);
if(mid<R)add(rs[x],mid+,r,L,R,c);
sum[x]=upt(sum[ls[x]]+sum[rs[x]]);
}
int query(int x,int l,int r,int L,int R)
{
if(l>=L&&r<=R)return sum[x];
pushdown(x,l,r); int ret=;
if(mid>=L)ret=upt(ret+query(ls[x],l,mid,L,R));
if(mid<R)ret=upt(ret+query(rs[x],mid+,r,L,R));
return ret;
}
int main()
{
n=rd(); p=rd();
for(int i=;i<=n;i++)a[i]=rd()%p;
build(++cnt,,n);
int m=rd();
for(int i=,tp,l,r,c;i<=m;i++)
{
tp=rd(); l=rd(); r=rd();
if(tp==)c=rd()%p,mul(,,n,l,r,c);
if(tp==)c=rd()%p,add(,,n,l,r,c);
if(tp==)printf("%d\n",query(,,n,l,r));
}
return ;
}

bzoj 1798 Seq 维护序列seq —— 线段树的更多相关文章

  1. 1798. [AHOI2009]维护序列【线段树】

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

  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. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

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

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

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

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

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

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

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

  10. bzoj 1798 [Ahoi2009]Seq 维护序列seq(线段树+传标)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1798 [题意] 给定一个序列,要求提供区间乘/加,以及区间求和的操作 [思路] 线段树 ...

随机推荐

  1. C# Http方式下载文件到本地

    下文代码是从网络(http://www.cnblogs.com/hayden/archive/2012/04/26/2472815.html)得来,亲测好用.我中修改了下格式和注释,版权属于原作者“舒 ...

  2. 我对Lamport Logical Clock的理解

    建议先看论文原文再来看这篇文章,我不会对论文中的各个点都具体说明.仅仅是写一些我自己的想法,帮助理解. 大家都知道.分布式环境下.确定各个事件发生的顺序非常重要,不然就会发生一些麻烦的问题. 考虑一下 ...

  3. C++11 并发指南一(C++11 多线程初探)(转)

    引言 C++11 自2011年发布以来已经快两年了,之前一直没怎么关注,直到最近几个月才看了一些 C++11 的新特性,今后几篇博客我都会写一些关于 C++11 的特性,算是记录一下自己学到的东西吧, ...

  4. Mina、Netty、Twisted一起学(七):公布/订阅(Publish/Subscribe)

    消息传递有非常多种方式.请求/响应(Request/Reply)是最经常使用的.在前面的博文的样例中.非常多都是採用请求/响应的方式.当server接收到消息后,会马上write回写一条消息到clie ...

  5. 以goroutine为例看协程的相关概念

    转自  http://wangzhezhe.github.io/blog/2016/02/17/golang-scheduler/ 基本上是网上相关文章的梳理,初衷主要是想了解下golang中的gor ...

  6. Android 学习之逐帧动画(Frame)

    帧动画就是将一些列图片.依次播放. 利用肉眼的"视觉暂留"的原理,给用户的感觉是动画的错觉,逐帧动画的原理和早期的电影原理是一样的. a:须要定义逐帧动画,能够通过代码定义.也能够 ...

  7. Linux基础(3)- 正文处理命令及tar命令、vi编辑器、硬盘分区、格式化及文件系统的管理和软连接、硬连接

    一.正文处理命令及tar命令 1)  将用户信息数据库文件和组信息数据库文件纵向合并为一个文件1.txt(覆盖) 2)  将用户信息数据库文件和用户密码数据库文件纵向合并为一个文件2.txt(追加) ...

  8. mysql 控制台环境下查询中文数据乱码,插入、更新中文数据不成功

    mysql 控制台环境下查询中文数据乱码,插入.更新中文数据不成功         登录mysql密码是加入编码参数--default-character-set,中文用gbk mysql -uroo ...

  9. sql quer

    SELECT (SELECT COUNT (sysid) FROM FwInvConsumable WHERE parentref = g.sysid AND (ns.state = 'Invento ...

  10. 为基于 x86 的 Android* 游戏选择合适的引擎

    摘要 游戏开发者知道 Android 中蕴藏着巨大的机遇. 在 Google Play 商店的前 100 款应用中,约一半是游戏应用(在利润最高的前 100 款应用中.它们所占的比例超过 90%). ...