分块,打标记,维护两个标记:乘的 和 加的。

每次 区间乘的时候,对 乘标记 和 加标记 都 乘上那个值。

每次 区间加的时候 对 加标记 加上那个值。

(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的更多相关文章

  1. BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]

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

  2. BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )

    线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...

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

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

  4. bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)

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

  5. bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...

  6. Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)

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

  7. BZOJ1798[Ahoi2009]Seq 维护序列seq 题解

    题目大意: 有长为N的数列,有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一段数全部加一个值; (3)询问数列中的一段数的和,由于答案可能很大,你只需输出这个数模P的值. ...

  8. 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树

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

  9. [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:$询 ...

随机推荐

  1. [hdu 1067]bfs+hash

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1067 queue里面果然不能放vector,还是自己写的struct比较省内存…… #include& ...

  2. intellij IDEA与springboot项目建立

    概念问题: IntelliJ系中的Project相当于Eclipse系中的workspace.IntelliJ系中的Module相当于Eclipse系中的Project.IntelliJ中一个Proj ...

  3. 串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))

    串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j ...

  4. nginx实时生成缩略图到硬盘上

    现在随着各终端的出现(手机,ipad等平板),以及各种终端的手机分辨率和尺寸都不同,现在手机用户流量都是宝,网上出现了各种各样的生成缩略图功能的架构,有使用php实时生成缩略图的,也有用nginx + ...

  5. c# vs2008报表

    1. 做报表没做几次,第一次做的都忘记了,还好今天做一下就把报表弄成功了.报表中“参数字段”是可以变的,就是说需要自己赋值或者是要计算的.而在苏据库字段里面的是固定的值.不需要计算(注:有的字段查询出 ...

  6. [NOIp普及组2011]瑞士轮

    洛谷题目链接:瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较 ...

  7. 好几次的CSS存档

    第一次: #site_nav_under { display: none; } .c_ad_block, .ad_text_commentbox { display: none; margin:; p ...

  8. linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】

    转自:http://blog.csdn.net/goodluckwhh/article/details/9006065 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-] 一信 ...

  9. python memcache操作-安装、连接memcache

    安装memecache wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x.x ./c ...

  10. [ 总结 ] nginx 负载均衡 及 缓存

    操作系统:centos6.4 x64 前端使用nginx做反向代理,后端服务器为:apache + php + mysql 1. nginx负载均衡. nginx编译安装(编译安装前面的文章已经写过) ...