【分块】bzoj1798 [Ahoi2009]Seq 维护序列seq
分块,打标记,维护两个标记:乘的 和 加的。
每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值。
每次 区间加的时候 对 加标记 加上那个值。
(ax+b)*v=axv+bv。开 long long。
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int n,sum,sz,num[],l[],r[],x,y,m,op;
ll MOD,a[],sumv[],lzy1[],lzy2[],v;
void makeblock()
{
sz=sqrt(n); if(!sz) sz=;
for(sum=;sum*sz<n;sum++)
{
l[sum]=r[sum-]+; r[sum]=sum*sz;
for(int i=l[sum];i<=r[sum];++i)
{
num[i]=sum;
sumv[sum]=(sumv[sum]+a[i])%MOD;
}
}
l[sum]=r[sum-]+; r[sum]=n;
for(int i=l[sum];i<=r[sum];++i)
{
num[i]=sum;
sumv[sum]=(sumv[sum]+a[i])%MOD;
}
for(int i=;i<=sum;++i) lzy1[i]=;
}
void pushdown(const int &p)
{
if(lzy1[p]!= || lzy2[p])
{
for(int i=l[p];i<=r[p];++i)
a[i]=(a[i]*lzy1[p]+lzy2[p])%MOD;
lzy1[p]=; lzy2[p]=;
}
}
void work1(const int &L,const int &R)
{
sumv[num[L]]=;
for(int i=L;i<=R;++i) a[i]=(a[i]*v)%MOD;
for(int i=l[num[L]];i<=r[num[L]];++i)
sumv[num[L]]=(sumv[num[L]]+a[i])%MOD;
}
void update1()
{
pushdown(num[x]); pushdown(num[y]);
if(num[x]==num[y]) work1(x,y);
else
{
work1(x,r[num[x]]); work1(l[num[y]],y);
for(int i=num[x]+;i<num[y];++i)
{
lzy1[i]=(lzy1[i]*v)%MOD;
lzy2[i]=(lzy2[i]*v)%MOD;
sumv[i]=(sumv[i]*v)%MOD;
}
}
}
void work2(const int &L,const int &R)
{
for(int i=L;i<=R;++i) a[i]=(a[i]+v)%MOD;
sumv[num[L]]=(sumv[num[L]]+(ll)(R-L+)*v)%MOD;
}
void update2()
{
pushdown(num[x]); pushdown(num[y]);
if(num[x]==num[y]) work2(x,y);
else
{
work2(x,r[num[x]]); work2(l[num[y]],y);
for(int i=num[x]+;i<num[y];++i)
{
lzy2[i]=(lzy2[i]+v)%MOD;
sumv[i]=(sumv[i]+(ll)sz*v)%MOD;
}
}
}
void query()
{
pushdown(num[x]); pushdown(num[y]); ll ans=;
if(num[x]==num[y]) {for(int i=x;i<=y;++i) ans=(ans+a[i])%MOD;}
else
{
for(int i=x;i<=r[num[x]];++i) ans=(ans+a[i])%MOD;
for(int i=l[num[y]];i<=y;++i) ans=(ans+a[i])%MOD;
for(int i=num[x]+;i<num[y];++i) ans=(ans+sumv[i])%MOD;
} printf("%d\n",(int)ans);
}
int main()
{
scanf("%d%lld",&n,&MOD);
for(int i=;i<=n;++i) scanf("%lld",&a[i]);
makeblock(); scanf("%d",&m);
for(;m>;--m)
{
scanf("%d%d%d",&op,&x,&y);
if(op==) {scanf("%lld",&v); update1();}
else if(op==) {scanf("%lld",&v); update2();}
else query();
}
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 ...
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- 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: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[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(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- BZOJ1798[Ahoi2009]Seq 维护序列seq 题解
题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...
- 【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:$询 ...
随机推荐
- 适用于实数范围的中缀表达式的 + - * / ( ) 计算(C++实现)
核心算法: mid=FormatMid(mid); //格式化中缀表达式 JudgeLegalMid(mid); //判断中缀表达式的合法性 MidToPost mtp(mid); mtp.ToPos ...
- HTML5之SVG详解(一):基本概括
转载自:http://www.cnblogs.com/hupeng/archive/2012/12/21/2828456.html 1.背景 SVG是Scalable Vector Graphics的 ...
- PHP 扒一扒这些题目都考了哪些知识点
1.模除 题目: <?php echo -10%3; *结果* -1 分析:其实这道题的知识点是在考模除和正负号的关系,那么我们看一段进阶的代码 <?php echo "10%3 ...
- background-color和background-image问题
今天撸码的时候发现需要background-color和background-image 一起用,才开始考虑两个可不可以一起用 查阅多方资料才知道可以写成background:color url() ...
- 转载:Java中的String与常量池
转载自http://developer.51cto.com/art/201106/266454.htm.感觉总结的不错,自己收藏一下. string是java中的字符串.String类是不可变的,对S ...
- linux基础之nginx和nfs服务
第一部分: 一.nginx服务安装nginx包(源码安装)1.先cd /etc/yum.repos.d目录下2.yum install epel-release -y(安装扩展包)3.yum in ...
- POJ2680(动态规划,大数)
Computer Transformation Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4548 Accepted ...
- KVM分析报告
转载 KVM分析报告 虚拟化技术工作组 2008-12-31 1. 概述 1.1. KVM简介 KVM是以色列开源组织Qumranet开发的一个开源虚拟机监控器,从Linux-2. ...
- Download PuTTY: latest development snapshot
Download PuTTY: latest development snapshot https://www.chiark.greenend.org.uk/~sgtatham/putty/lates ...
- react native windows 搭建(完整版)
声明:用windows 搭建的react native只能开发安卓应用 1.准备安装java jdk,以及Android SDK 传送门: java JDK Android SDK(自行寻找) ...