裸的线段树,注意标签下放就行了

多么痛的领悟,一定要开int64

/**************************************************************
Problem:
User: BLADEVIL
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/ //By BLADEVIL
type
rec =record
left, right, sum :int64;
m_flag, p_flag :int64;
end; var
n, p, m :int64;
t :array[..] of rec; procedure build(x,l,r:int64);
var
mid :int64;
begin
t[x].left:=l; t[x].right:=r;
t[x].m_flag:=;
if l=r then
begin
read(t[x].sum);
t[x].sum:=t[x].sum mod p;
exit;
end;
with t[x] do mid:=(left+right) div ;
build(x*,l,mid); build(x*+,mid+,r);
t[x].sum:=(t[x*].sum+t[x*+].sum) mod p;
end; procedure m_change(x,l,r,c:int64);
var
mid :int64;
cur :int64; begin
if t[x].left<>t[x].right then
begin
if t[x].m_flag<> then
begin
cur:=t[x].m_flag;
t[*x].m_flag:=(t[*x].m_flag*cur) mod p;
t[*x].p_flag:=(t[*x].p_flag*cur) mod p;
t[*x].sum:=(t[*x].sum*cur) mod p;
t[*x+].m_flag:=(t[*x+].m_flag*cur) mod p;
t[*x+].p_flag:=(t[*x+].p_flag*cur) mod p;
t[*x+].sum:=(t[*x+].sum*cur) mod p;
t[x].m_flag:=;
end;
if t[x].p_flag<> then
begin
cur:=t[x].p_flag;
t[*x].p_flag:=(t[*x].p_flag+cur) mod p;
t[*x].sum:=(t[*x].sum+cur*(t[*x].right-t[*x].left+)) mod p;
t[*x+].p_flag:=(t[*x+].p_flag+cur) mod p;
t[*x+].sum:=(t[*x+].sum+cur*(t[*x+].right-t[*x+].left+)) mod p;
t[x].p_flag:=;
end;
end;
if (t[x].left=l) and (t[x].right=r) then
begin
t[x].sum:=(t[x].sum*c) mod p;
t[x].p_flag:=(t[x].p_flag*c mod p);
t[x].m_flag:=(t[x].m_flag*c mod p);
exit;
end;
with t[x] do mid:=(left+right) div ;
if l>mid then m_change(x*+,l,r,c) else
if r<=mid then m_change(x*,l,r,c) else
begin
m_change(x*,l,mid,c);
m_change(x*+,mid+,r,c);
end;
t[x].sum:=(t[*x].sum+t[*x+].sum) mod p;
end; procedure p_change(x,l,r,c:int64);
var
mid :int64;
cur :int64;
begin
if t[x].left<>t[x].right then
begin
if t[x].m_flag<> then
begin
cur:=t[x].m_flag;
t[*x].m_flag:=(t[*x].m_flag*cur) mod p;
t[*x].p_flag:=(t[*x].p_flag*cur) mod p;
t[*x].sum:=(t[*x].sum*cur) mod p;
t[*x+].m_flag:=(t[*x+].m_flag*cur) mod p;
t[*x+].p_flag:=(t[*x+].p_flag*cur) mod p;
t[*x+].sum:=(t[*x+].sum*cur) mod p;
t[x].m_flag:=;
end;
if t[x].p_flag<> then
begin
cur:=t[x].p_flag;
t[*x].p_flag:=(t[*x].p_flag+cur) mod p;
t[*x].sum:=(t[*x].sum+cur*(t[*x].right-t[*x].left+)) mod p;
t[*x+].p_flag:=(t[*x+].p_flag+cur) mod p;
t[*x+].sum:=(t[*x+].sum+cur*(t[*x+].right-t[*x+].left+)) mod p;
t[x].p_flag:=;
end;
end;
if (t[x].left=l) and (t[x].right=r) then
begin
t[x].sum:=(t[x].sum+c*(r-l+)) mod p;
t[x].p_flag:=(t[x].p_flag+c) mod p;
exit;
end;
with t[x] do mid:=(left+right) div ;
if l>mid then p_change(x*+,l,r,c) else
if r<=mid then p_change(x*,l,r,c) else
begin
p_change(x*,l,mid,c);
p_change(x*+,mid+,r,c);
end;
t[x].sum:=(t[x*].sum+t[x*+].sum) mod p;
end; function ask(x,l,r:int64):int64;
var
mid :int64;
cur :int64;
begin
if t[x].left<>t[x].right then
begin
if t[x].m_flag<> then
begin
cur:=t[x].m_flag;
t[*x].m_flag:=(t[*x].m_flag*cur) mod p;
t[*x].p_flag:=(t[*x].p_flag*cur) mod p;
t[*x].sum:=(t[*x].sum*cur) mod p;
t[*x+].m_flag:=(t[*x+].m_flag*cur) mod p;
t[*x+].p_flag:=(t[*x+].p_flag*cur) mod p;
t[*x+].sum:=(t[*x+].sum*cur) mod p;
t[x].m_flag:=;
end;
if t[x].p_flag<> then
begin
cur:=t[x].p_flag;
t[*x].p_flag:=(t[*x].p_flag+cur) mod p;
t[*x].sum:=(t[*x].sum+cur*(t[*x].right-t[*x].left+)) mod p;
t[*x+].p_flag:=(t[*x+].p_flag+cur) mod p;
t[*x+].sum:=(t[*x+].sum+cur*(t[*x+].right-t[*x+].left+)) mod p;
t[x].p_flag:=;
end;
end;
if (t[x].left=l) and (t[x].right=r) then
begin
ask:=t[x].sum mod p;
exit;
end;
with t[x] do mid:=(left+right) div ;
if l>mid then ask:=ask(x*+,l,r) else
if r<=mid then ask:=ask(x*,l,r) else
ask:=(ask(x*,l,mid)+ask(x*+,mid+,r)) mod p;
end; procedure init;
begin
read(n,p);
build(,,n);
end; procedure main;
var
i :longint;
k, l, r, x :int64; begin
read(m);
for i:= to m do
begin
read(k);
if k= then
begin
read(l,r,x);
m_change(,l,r,x);
end else
if k= then
begin
read(l,r,x);
p_change(,l,r,x);
end else
if k= then
begin
read(l,r);
writeln(ask(,l,r));
end;
end;
end; begin
init;
main;
end.

赠送对拍器

var
n, m, p :longint;
r, l :longint;
i :longint;
k :longint;
begin
randomize;
n:=;
m:=;
p:=random()+;
writeln(n,' ',p);
for i:= to n do write(random()+,' ');
writeln;
writeln(m);
for i:= to m do
begin
r:=random(n)+;
l:=random(r)+;
k:=random()+;
if k= then
writeln(k,' ',l,' ',r) else
writeln(k,' ',l,' ',r,' ',random()+);
end;
end.

bzoj 1798 维护序列seq 线段树的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)

    [题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...

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

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

  8. bzoj 1798 维护序列seq

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

  9. bzoj 1798 [Ahoi2009]Seq 维护序列seq ——线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798 先乘后加,就可给加法标记乘上乘法标记. 注意可能有 *0 的操作,所以 pshd 时不 ...

随机推荐

  1. Python初步

    准备在工作之余看看Python的东西 收录一些资料 Python初学者(零基础学习Python.Python入门)常见问题:书籍推荐.资料.社区 http://blog.csdn.net/xiaowa ...

  2. django2.0 以上版本安装 xadmin

    1.xadmin的下载 源码包下载地址: https://github.com/sshwsfc/xadmin/tree/django2 2.使用命令安装xadmin pip install 你下载的压 ...

  3. 最短路径——Bellman-Ford算法

    一.相关定义 最短路径:求源点到某特定点的最短距离 特点:Bellman-Ford算法主要是针对有负权值的图,来判断该图中是否有负权回路或者存在最短路径的点 局限性:算法效率不高,不如SPFA算法 时 ...

  4. c# 复选下拉框

    引用dll: http://pan.baidu.com/s/1qXa97UO 自定义类: namespace TMI_S { /// <summary> /// 功能描述:自定义多选下拉框 ...

  5. java线程(4)——线程同步的锁技术

    同步 同步,字面来看,有点一起工作的意思.但在线程同步中,"同"意为协同.互相配合. 比如: A.B两个线程,并不是说两个线程必须同时一起工作,而是说互相配合工作,在某个时间可能线 ...

  6. 用js通过url传参把数据从一个页面传到另一个页面

    好长时间没写博客了,时值五一,外面到处人山人海,本宝宝还是好好呆在家学习吧.好了,言归正传.在没有后台支持的情况下,如何实现从一个页面像另一个页面来传递数据呢?应该很多人遇到过这个问题吧.那我就来说说 ...

  7. Redis学习笔记之基础篇

    Redis是一款开源的日志型key-value数据库,目前主要用作缓存服务器使用. Redis官方并没有提供windows版本的服务器,不过微软官方开发了基于Windows的Redis服务器Micro ...

  8. JQuery事件对象的属性和方法

    这是今天的总结,以后学习自己可以当参考书来读读.Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态.事件通常与函数结合使用,函数不会在事件发生前被执行 ...

  9. 【C++ 拾遗】Function-like Macros

    Macro expansion is done by the C preprocessor at the beginning of compilation. The C preprocessor is ...

  10. POJ 3693 Maximum repetition substring(最多重复次数的子串)

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10461   Ac ...