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

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

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

(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. Educational Codeforces Round 55:A. Vasya and Book

    A. Vasya and Book 题目链接:https://codeforc.es/contest/1082/problem/A 题意: 给出n,x,y,d,x是起点,y是终点,d是可以跳的格数,注 ...

  2. java获取mysql数据库表、字段、字段类型、字段注释

    最近想要写一个根据数据库表结构生成实体.mapper接口.mapping映射文件.service类的简单代码生成工具,所以查阅了一些资料,怎样获取数据库的表.表中字段.字段类型.字段注释等信息. 最后 ...

  3. Spring Framework框架解析(1)- 从图书馆示例来看xml文件的加载过程

    引言 这个系列是我阅读Spring源码后的一个总结,会从Spring Framework框架的整体结构进行分析,不会先入为主的讲解IOC或者AOP的原理,如果读者有使用Spring的经验再好不过.鉴于 ...

  4. c# vs2008报表

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

  5. 【Foreign】朗格拉日计数 [暴力]

    朗格拉日计算 Time Limit: 10 Sec  Memory Limit: 128 MB Description Input Output 仅一行一个整数表示答案. Sample Input 5 ...

  6. [POJ1180&POJ3709]Batch Scheduling&K-Anonymous Sequence 斜率优化DP

    POJ1180 Batch Scheduling Description There is a sequence of N jobs to be processed on one machine. T ...

  7. python 文件操作 r w a

    python基础-文件操作   一.文件操作 对文件操作的流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件       打开文件时,需要指定文件路径和以何等方式打开文件, ...

  8. UVALIVE 3891 The Teacher's Side of Math

    One of the tasks students routinely carry out in their mathematics classes is to solve a polynomial ...

  9. BZOJ 1432

    Description Input 一行两个整数n; k. Output 一行一个整数,表示n 个函数第k 层最少能由多少段组成.     #include<iostream> using ...

  10. src2中的alpha融合ROI

    #include <cv.h> #include <highgui.h> int main(int argc, char** argv) { IplImage *src1,*s ...