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

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

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

(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. Fragmenttabhost的使用教程

    1.准备tab的图标,放到mipmap目录下面,大小64x64,准备2种,一种是选中的,一种是未选中的,如下图 2.重写fragmentabhost,防止调用fragment每次点击tab都要重新调用 ...

  2. linux启动一个web项目时验证码不能出现的问题的解决

    解决方法: 在tomcatcatalina.sh中搜索cygwin=false,然后在它的上面加上这句话JAVA_OPTS='-Djava.awt.headless=true' 具体参考如下图片: 然 ...

  3. sls语法:创建file,创建文件夹

    http://blog.kukafei520.net/html/2014/942.html /tmp/aaa.txt: file.managed /tmp/salt_test: file.direct ...

  4. fieldset——一个不常用的HTML标签

    fieldset 标签 -- 对表单进行分组 在form表单中,我们可以对form中的信息进行分组归类,如注册表单的form,我们可以将注册信息分组成 基本信息(一般为必填) 详细信息(一般为可选) ...

  5. GoogleMap在js中的应用

    <html> <head> <meta name="viewport" content="initial-scale=1.0, user-s ...

  6. WebView使用--文章集锦

    对于android WebView加载不出Html5网页的解决方法 在android4.4中webview的使用相对于之前版本的一些区别 理解WebKit和Chromium: Android 4.4 ...

  7. 动态规划:数位DP

    数位dp一般应用于: 求出在给定区间[A,B]内,符合条件P(i)的数i的个数 条件P(i)一般与数的大小无关,而与 数的组成 有关 例题是一道BZOJ1833,让求出区间所有整数每个数字出现的次数 ...

  8. 【BZOJ3700】发展城市 [LCA][RMQ]

    发展城市 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 众所周知,Hzwer学长是一名高富 ...

  9. bzoj1008 矩乘递推

    2013-11-17 10:38 原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1008 比较水的题,直接矩阵乘法+递推就OK了 w[i,0 ...

  10. linux下检测可用串口并使用minicom打开(改进版)

    之前使用的方式是这样的 http://www.cnblogs.com/zqb-all/p/7073612.html 这两天看到minicom的参数,可以直接使用 -D 指定设备,于是修改成了这样 建立 ...