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

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

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

(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. POJ2236:Wireless Network(并查集)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 39772   Accepted: 164 ...

  2. selenium 获取某个元素的html

    <table> <tbody id="tb-37327761306"> <tr class="sep-row"><td ...

  3. MUI 按两次返回键退出应用 及 地理位置获取

    <span style="font-size:14px;"><span style="font-size:14px;"> mui.plu ...

  4. Web应用程序开发,基于Ajax技术的JavaScript树形控件

    感谢http://www.cnblogs.com/dgrew/p/3181769.html#undefined 在Web应用程序开发领域,基于Ajax技术的JavaScript树形控件已经被广泛使用, ...

  5. L3-003. 社交集群(并查集)

    L3-003. 社交集群 时间限制 1000 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 在社交网络平台注册时,用户通常会输入自己的兴趣爱好, ...

  6. 【BZOJ】1592: [Usaco2008 Feb]Making the Grade 路面修整

    [算法]动态规划DP [题解] 题目要求不严格递增或不严格递减. 首先修改后的数字一定是原来出现过的数字,这样就可以离散化. f[i][j]表示前i个,第i个修改为第j个数字的最小代价,a表示排序后数 ...

  7. 我在开发中所遇到的iOS7新特性以及iOS7与iOS6的适配问题总结

      ⓵UIImageView 1. // iOS7添加的对图像颜色处理的功能,过滤颜色的功能 2. _imageView.tintColor = [UIColor blueColor]; 3. //重 ...

  8. React事件处理程序

    function ActionLink() { function handleClick(e) { e.preventDefault(); console.log('The link was clic ...

  9. Cpython解释器支持的进程与线程

    一.理论部分 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的 ...

  10. malloc和new的区别 begin

    http://blog.csdn.net/miss_acha/article/details/7279915#comments 1.综述 1,malloc与free是C++/C语言的标准库函数,new ...