BZOJ1798[Ahoi2009]Seq 维护序列seq 题解
题目大意:
有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值。
思路:
用线段树来维护当前的值和要加以及乘的值,由于加与乘是有序的,所以要在做子树之前将标记下传(注意顺序),加和乘分开来、合起来处理都可以。
代码:(当初手抽将1打成l一直RE调了半天才发现)
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAX 400000
#define LL long long
using namespace std; LL sum[MAX],mul[MAX],add[MAX],mod; void up_date(int cur)
{
sum[cur]=(sum[cur<<]+sum[cur<<|])%mod;
} void creat(int L,int R,int x,int y,int cur)
{
mul[cur]=;
add[cur]=;
sum[cur]+=y;
if (L==R) return;
int mid=L+R>>;
if (x>mid) creat(mid+,R,x,y,cur<<|);
else creat(L,mid,x,y,cur<<);
up_date(cur);
} void push_down(int cur,int l,int r,int mid)
{
if (mul[cur]== && add[cur]==) return;
mul[cur<<]=mul[cur<<]*mul[cur]%mod;
add[cur<<]=(add[cur<<]*mul[cur]%mod+add[cur])%mod;
sum[cur<<]=(sum[cur<<]*mul[cur]%mod+add[cur]*(LL)(mid-l+)%mod)%mod;
mul[cur<<|]=mul[cur<<|]*mul[cur]%mod;
add[cur<<|]=(add[cur<<|]*mul[cur]%mod+add[cur])%mod;
sum[cur<<|]=(sum[cur<<|]*mul[cur]%mod+add[cur]*(LL)(r-mid)%mod)%mod;
mul[cur]=;
add[cur]=;
return;
} void change_mul(int L,int R,int l,int r,int x,int cur)
{
if (L>=l && R<=r)
{
mul[cur]=mul[cur]*(LL)x%mod;
add[cur]=add[cur]*(LL)x%mod;
sum[cur]=sum[cur]*(LL)x%mod;
return;
}
int mid=L+R>>;
push_down(cur,L,R,mid);
if (l<=mid) change_mul(L,mid,l,r,x,cur<<);
if (r>mid) change_mul(mid+,R,l,r,x,cur<<|);
up_date(cur);
} void change_add(int L,int R,int l,int r,int x,int cur)
{
if (L>=l && R<=r)
{
add[cur]=(add[cur]+(LL)x)%mod;
sum[cur]=(sum[cur]+(LL)(R-L+)*x%mod)%mod;
return;
}
int mid=L+R>>;
push_down(cur,L,R,mid);
if (l<=mid) change_add(L,mid,l,r,x,cur<<);
if (r>mid) change_add(mid+,R,l,r,x,cur<<|);
up_date(cur);
} LL ask(int L,int R,int l,int r,int cur)
{
if (L>=l && R<=r) return sum[cur];
int mid=L+R>>;
LL ans=;
push_down(cur,L,R,mid);
if (l<=mid) ans=(ans+ask(L,mid,l,r,cur<<))%mod;
if (r>mid) ans=(ans+ask(mid+,R,l,r,cur<<|))%mod;
up_date(cur);
return ans;
} int main()
{
int n,m,a,b,c,i,x;
scanf("%d%lld",&n,&mod);
for (i=;i<=n;i++) scanf("%d",&a),creat(,n,i,a%mod,);
scanf("%d",&m);
for (i=;i<=m;i++)
{
scanf("%d",&x);
if (x==) scanf("%d%d%d",&a,&b,&c),change_mul(,n,a,b,c%mod,);
if (x==) scanf("%d%d%d",&a,&b,&c),change_add(,n,a,b,c%mod,);
if (x==) scanf("%d%d",&a,&b),printf("%lld\n",ask(,n,a,b,));
}
return ;
}
BZOJ1798[Ahoi2009]Seq 维护序列seq 题解的更多相关文章
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- 1798: [Ahoi2009]Seq 维护序列seq
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 2930 Solved: 1087[Submit ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- [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
1.题目大意:区间修改乘法操作和加法操作,求区间和 2.分析:为了填补bzoj2631的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...
随机推荐
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- Messenger
Messenger类实际是对Aidl方式的一层封装.本文只是对如何在Service中使用Messenger类实现与客户端的通信进行讲解,对Messenger的底层不做说明.阅读Android Prog ...
- CLR via C#(12)-委托Delegate
本来按照进度应该学习事件了,可总觉得应该委托在前,事件在后,才好理解. 委托是一个类,它提供了回调函数机制,而且是类型安全的.使用委托可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数 ...
- MVC - 11(上).DTO
1.重要:javaScriptSerializer 无法识别被序列化的对象里各种属性是否存在 循环依赖 (System,Web.Script.Serialization.JavaScriptSeri ...
- CentOS下Apache安装SSL
https是一个安全的访问方式,数据在传输过程中是加密的.https基于ssl. 一.安装apache和ssl模块1.安装apacheyum install httpd2.安装ssl模块yum ins ...
- 企业QQ 增加在线交谈链接
企业QQ的在线交流链接跟普通QQ的在线交流不一样,普通QQ的在线交流,可以在http://shang.qq.com/v3/widget.html生成:企业qq的链接可以按以下步骤添加: 第一步:引入企 ...
- .NET Nancy 详解(二) 简易路由实现
继续上面的简易版本,有意思的点剩下便是路由实现了. 路由注册 首先,来看一下基本的路由注册过程. public FakeNancyModuleWithoutBasePath() { Delete[&q ...
- Oracle优化-表设计
前言 绝大多数的Oracle数据库性能问题都是由于数据库设计不合理造成的,只有少部分问题根植于Database Buffer.Share Pool.Redo Log Buffer等内存模块配置不合理, ...
- hdu 4751 2013南京赛区网络赛 二分图判断 **
和以前做过的一个二分图颇为相似,以前的是互相不认识的放在一组,这个是互相认识的,本质上是相同的 是 hdu 2444 #include<cstdio> #include<iostre ...
- [Qcon] 百姓网开发总结
拿到的PPT看了之后,发现给出的很简洁,但每个步骤用处却非常有用,我们一个个来分析: 1. 集中开发环境,这些方法看似简单,但是都是很实用的方法,在我开发中看的出来,SVN无分支就能解决我现有部门的部 ...
- 62个Android Studio小技巧合集
1书签(Bookmarks) 描述:这是一个很有用的功能,让你可以在某处做个标记(书签),方便后面再跳转到此处. 调用:Menu → Navigate → Bookmarks 快捷键: 添加/移除书签 ...