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的坑还是写一发题解吧,首先呢,既然想要双标记,但是这两个标记之间又有着制约作用,所以要定义优先级,这个优先级就定义 ...
随机推荐
- AngularJS 简介、指令、表达式
AngularJS 是一个 JavaScript 框架.它可通过 <script> 标签添加到 HTML 页面. AngularJS 通过指令扩展了 HTML,且通过表达式绑定数据到 HT ...
- 让那些为Webkit优化的网站也能适配IE10(转载)
转载地址:http://www.w3cplus.com/css3/adapting-your-webkit-optimized-site-for-internet-explorer-10.html 特 ...
- 无废话ExtJs 入门教程五[文本框:TextField]
无废话ExtJs 入门教程五[文本框:TextField] extjs技术交流,欢迎加群(201926085) 继上一节内容,我们在表单里加了个两个文本框.如下所示代码区的第42行位置,items: ...
- iOS 随记
UIImage 走缓存 + (UIImage *)imageNamed:(NSString *)name; 不走缓存 + (UIImage *)imageWithContentsOfFile:(NSS ...
- Java 初学记录之一 快速输入
1. sysout 按回车 System.out.println();
- 打造理想的Windows 10 APP开发环境的5个步骤
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软即将发布Windows 10手机版,实际上很多人现在已经开始在开发Windows ...
- Hbuilder连接模拟器调试
Hbuilder是一个非常好用的HTML5开发IDE,我最喜欢的功能就是连接手机调试了,连接手机调试有两种途径,一是通过USB连接真机,二是下载安装一个安卓模拟器,让Hbuilder连接到安卓模拟器, ...
- [Liferay6.2]启动Tomcat提示APR不能在java类库路径中被找到的解决办法
问题描述 启动liferay之后,在控制台中打印出会打印出以下信息: 信息: The APR based Apache Tomcat Native library which allows optim ...
- C语言中运算符的口决
- 【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度
代码处理逻辑: 代码流程: 1.首先需要创建一个实体 用来存储 相关信息 package com.sxd.test.unusualName; public class NameEntity { pri ...