线段树。支持区间加、区间乘、区间查询和。

标记下移还有取模要注意。

  • var

  • n,p,q,i,s,t:longint;

  • a:int64;

  • num,n1,n2,n3:array[0..500000] of int64;

  • procedure build(o,l,r:longint);

  • var m,i:longint;

  • begin

  • m:=(l+r) div 2;

  • if l=r then

  • begin

  • n1[o]:=num[l];

  • n2[o]:=num[l];

  • end

  • else

  • begin

  • build(o*2,l,m);

  • build(o*2+1,m+1,r);

  • end;

  • if o>1 then n1[o div 2]:=(n1[o div 2]+n1[o]) mod p;

  • end;

  • procedure add(o,l,r:longint);

  • var m,i:longint;

  • begin

  • m:=(l+r) div 2;

  • if l<>r then

  • begin

  • n1[o*2]:=(n1[o*2]*n3[o]+n2[o]*((m-l+1) mod p)) mod p;

  • n2[o*2]:=(n2[o*2]*n3[o]+n2[o]) mod p;

  • n3[o*2]:=(n3[o*2]*n3[o]) mod p;

  • n1[o*2+1]:=(n1[o*2+1]*n3[o]+n2[o]*((r-m) mod p)) mod p;

  • n2[o*2+1]:=(n2[o*2+1]*n3[o]+n2[o]) mod p;

  • n3[o*2+1]:=(n3[o*2+1]*n3[o]) mod p;

  • n2[o]:=0;n3[o]:=1;

  • end;

  • if (s<=l)and(r<=t) then

  • begin

  • n1[o]:=(n1[o]+a*((r-l+1) mod p)) mod p;

  • n2[o]:=(n2[o]+a) mod p;

  • end

  • else

  • begin

  • if s<m+1 then add(o*2,l,m);

  • if m<t then add(o*2+1,m+1,r);

  • n1[o]:=(n1[o*2]+n1[o*2+1]) mod p;

  • end;

  • end;

  • procedure che(o,l,r:longint);

  • var m,i:longint;

  • begin

  • m:=(l+r) div 2;

  • if l<>r then

  • begin

  • n1[o*2]:=(n1[o*2]*n3[o]+n2[o]*((m-l+1) mod p)) mod p;

  • n2[o*2]:=(n2[o*2]*n3[o]+n2[o]) mod p;

  • n3[o*2]:=(n3[o*2]*n3[o]) mod p;

  • n1[o*2+1]:=(n1[o*2+1]*n3[o]+n2[o]*((r-m) mod p)) mod p;

  • n2[o*2+1]:=(n2[o*2+1]*n3[o]+n2[o]) mod p;

  • n3[o*2+1]:=(n3[o*2+1]*n3[o]) mod p;

  • n2[o]:=0;n3[o]:=1;

  • end;

  • if (s<=l)and(r<=t) then

  • begin

  • n1[o]:=(n1[o]*a) mod p;

  • n2[o]:=(n2[o]*a) mod p;

  • n3[o]:=(n3[o]*a) mod p;

  • end

  • else

  • begin

  • if s<m+1 then che(o*2,l,m);

  • if m<t then che(o*2+1,m+1,r);

  • n1[o]:=(n1[o*2]+n1[o*2+1]) mod p;

  • end;

  • end;

  • function que(o,l,r:longint):int64;

  • var m,i:longint;

  • begin

  • m:=(l+r) div 2;

  • que:=0;

  • if l<>r then

  • begin

  • n1[o*2]:=(n1[o*2]*n3[o]+n2[o]*((m-l+1) mod p)) mod p;

  • n2[o*2]:=(n2[o*2]*n3[o]+n2[o]) mod p;

  • n3[o*2]:=(n3[o*2]*n3[o]) mod p;

  • n1[o*2+1]:=(n1[o*2+1]*n3[o]+n2[o]*((r-m) mod p)) mod p;

  • n2[o*2+1]:=(n2[o*2+1]*n3[o]+n2[o]) mod p;

  • n3[o*2+1]:=(n3[o*2+1]*n3[o]) mod p;

  • n2[o]:=0;n3[o]:=1;

  • end;

  • if (s<=l)and(r<=t) then que:=n1[o]

  • else

  • begin

  • if s<m+1 then que:=(que+que(o*2,l,m)) mod p;

  • if m<t then que:=(que+que(o*2+1,m+1,r)) mod p;

  • end;

  • end;

  • begin

  • read(n,p);

  • for i:=1 to n do read(num[i]);

  • for i:=1 to n do num[i]:=num[i] mod p;

  • for i:=1 to 3*n do n3[i]:=1;

  • build(1,1,n);

  • read(q);

  • for i:=1 to q do

  • begin

  • read(a);

  • case a of

  • 1:begin

  • read(s,t,a);

  • a:=a mod p;

  • che(1,1,n);

  • end;

  • 2:begin

  • read(s,t,a);

  • a:=a mod p;

  • add(1,1,n);

  • end;

  • 3:begin

  • read(s,t);

  • writeln(que(1,1,n));

  • end;

  • end;

  • end;

  • end.

我写的有些麻烦。。。

BZOJ-1798 维护序列的更多相关文章

  1. bzoj 1798 维护序列seq

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 题解: 高级一点的线段树,加上了区间乘法运算,则需要增加一个数组mulv记录乘的因数 ...

  2. bzoj 1798 维护序列seq 线段树

    裸的线段树,注意标签下放就行了 多么痛的领悟,一定要开int64 /************************************************************** Pro ...

  3. [BZOJ 1500] 维护序列

    Link: BZOJ 1500 传送门 Solution: 可能平衡树维护序列的所有操作都在这了吧…… 对序列的维护$fhq treap$和$Splay$都能做 有几个注意点: 1.维护序列时始终记得 ...

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

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

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

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

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

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

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

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

  8. 【BZOJ】【1798】【AHOI2009】Seq维护序列

    线段树 属于线段树中级应用吧…… 要打两种标记:乘法和加法标记.一开始我想着可以像只有加法标记那样,永不下传,查询的时候依次累加就好了.后来发现不会写……只好每次update的时候……遇到标记!下传! ...

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

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

  10. bzoj 维护序列seq(双标记线段树)

    Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 4184  Solved: 1518[Submit][Status][Discus ...

随机推荐

  1. codeforce Gym 100342H Hard Test (思考题)

    题意:构造让Dijkstra单源最短路算法有效松弛次数最多的数据... 题解:构造,题意换种说法就是更新晚的路径要比更新早的路径短.因为所有点都会更新一次,那么按照更新时间形成一条链,即到最后一个点的 ...

  2. java中的String对象的创建及堆栈的解释

    java中的string真的是很令人头疼呢!!! 请看这里 看这里

  3. Bootstrap历练实例:默认的缩略图

    本章将讲解Bootstrap缩略图,大多数站点都需要要在网格中布局图像,视频,文本.Bootstrap通过缩略图为此提供了一些简便的方法,使用Bootstrap创建缩略图的步骤如下: 1.在图像的周围 ...

  4. java,根据输入的月和日,计算出是本年的第几天。

    package study01; import java.util.Scanner; public class TestDay { /* * 输入2017年的月和日:month=?,day=? 输出输 ...

  5. 基于GPS\北斗、GIS、GPRS技术构建智能巡检系统

    巡线工负责输油管网设施的日常巡查,可以及时发现管网设施是否完好.但巡检工作辛苦,加之管线在大部分情况下又处于良好状态,使得巡检人员麻痹大意,往往不能按规定程序进行巡检,造成巡检不到位,这样就不能从根本 ...

  6. linux文件或文件夹常见操作

    创建文件夹 mkdir [-p] DirName  在工作目录下,建立一个名为 A 新的子目录 : mkdir A  在工作目录下的 B目录中,建立一个名为 T 的子目录:    若 B 目录不存在, ...

  7. 【转】matlab练习程序(奇异值分解压缩图像)

    介绍一下奇异值分解来压缩图像.今年的上半年中的一篇博客贴了一篇用奇异值分解处理pca问题的程序,当时用的是图像序列,是把图像序列中的不同部分分离开来.这里是用的不是图像序列了,只是单单的一幅图像,所以 ...

  8. [LUOGU] NOIP提高组模拟赛Day1

    题外话:以Ingress为题材出的比赛好评,绿军好评 T1 考虑枚举第\(i\)个人作为左边必选的一个人,那左边剩余\(i-1\)个人,选法就是\(2^{i-1}\),也就是可以任意选或不选,右侧剩余 ...

  9. matlplotlib根据函数画出图形

    根据函数画出函数的轨迹 import matht = np.linspace(0, math.pi, 1000)x = np.sin(t)y = np.cos(t) + np.power(x, 2.0 ...

  10. python-matplotlib-lec1

    接演前文. 设置属性的方法: 使用对象的set_*方法,单独设置每个属性:或使用plt.setp同时设置多个属性 # -*- coding: utf-8 -*- import numpy as np ...