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的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...
随机推荐
- SQL Server占用内存的认识
SQL Server占用的内存主要由三部分组成:数据缓存(Data Buffer).执行缓存(Procedure Cache).以及SQL Server引擎程序.SQL Server引擎程序所占用缓存 ...
- (转)ORA-12519: TNS:no appropriate service handler found 的问题处理。
很多时候出现:ORA-12519: TNS:no appropriate service handler found 都是由于当前的连接数已经超出他能够处理的最大值了. 处理方法如下:摘自网上. se ...
- javascript 面向对象编程小记
虽然平常用jquery用的很熟,但是基本都是面向过程的写法.一个事件一个function,很少有面向对象的写法.今天得写一个日期控件,不得不用上面向对象编程. 刚开始我的想法是: var datepi ...
- SQL Server数据库大型应用解决方案总结(转载)
转载地址:http://hb.qq.com/a/20120111/000216.htm 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每天百万级甚至 ...
- Delphi的枚举类型
参考:http://blog.csdn.net/kissdeath/article/details/2060573 Delphi程序不仅可以用于数值处理,还更广泛的用于处理非数值的数据.例如:性别.月 ...
- Fallout4 Creation Kit
按住SHIFT是旋转视角,按住鼠标中键 E是移动物品 双击W是旋转物品 数字键2 是调整物品大小
- LSM-Tree (BigTable 的理论模型)(转)
Google的BigTable架构在分布式结构化存储方面大名鼎鼎,其中的MergeDump模型在读写之间找到了一个较好的平衡点,很好的解决了web scale数据的读写问题. MergeDump的理论 ...
- Oracle 监听器
Oracle监听器listener是一个重要的数据库服务器组件,在整个Oracle体系结构中,扮演着重要的作用. 监听器Lisener功能 从当前的Oracle版本看,Listener主要负责下面的几 ...
- Error:“应用程序无法正常启动(0xc000007b)。请单击“确定”关闭应用程序。”
我的电脑是 win7 64bit,用 VS2012 跑网上下载的程序,Realease | x64 模式下出现该错误. 问题出在 freeglut.dll 是 32bit 下的 dll,需要换成 64 ...
- Java学习笔记(四)——流程控制语句
一.条件语句 1.if条件语句 (1)语法: if(条件) { 条件成立时的代码 } (2)执行过程 2.if else语句 if(条件) { 条件成立时的代码 } else { 不成立的代码 } 3 ...