bzoj 1798 维护序列seq 线段树
裸的线段树,注意标签下放就行了
多么痛的领悟,一定要开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 线段树的更多相关文章
- BZOJ 1798: [Ahoi2009]Seq 维护序列seq( 线段树 )
线段树.. 打个 mul , add 的标记就好了.. 这个速度好像还挺快的...( 相比我其他代码 = = ) 好像是#35.. ---------------------------------- ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq 线段树 区间乘法区间加法 区间求和
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeO ...
- Bzoj 1798: [Ahoi2009]Seq 维护序列seq(线段树区间操作)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小可 ...
- bzoj 1798: [Ahoi2009]Seq 维护序列seq (线段树 ,多重标记下放)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 7773 Solved: 2792[Submit ...
- BZOJ1798: [Ahoi2009]Seq 维护序列seq[线段树]
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MBSubmit: 5504 Solved: 1937[Submit ...
- 【BZOJ】1798: [Ahoi2009]Seq 维护序列seq 线段树多标记(区间加+区间乘)
[题意]给定序列,支持区间加和区间乘,查询区间和取模.n<=10^5. [算法]线段树 [题解]线段树多重标记要考虑标记与标记之间的相互影响. 对于sum*b+a,+c直接加上即可. *c后就是 ...
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq 线段树
题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...
- bzoj 1798 维护序列seq
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1798 题解: 高级一点的线段树,加上了区间乘法运算,则需要增加一个数组mulv记录乘的因数 ...
- bzoj 1798 [Ahoi2009]Seq 维护序列seq ——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1798 先乘后加,就可给加法标记乘上乘法标记. 注意可能有 *0 的操作,所以 pshd 时不 ...
随机推荐
- [B2B、B2C、C2C] 区别介绍
最近在学习建站系统的时候,偶尔我们的老大会说几个自己所不太了解的名词“简称”,所以呢?我就总结了一下,如果有不全面的地方,还请博友们多多指点! B2B B2B(也有写成BTB)是指企业对企业之间的营销 ...
- #Spring实战第二章学习笔记————装配Bean
Spring实战第二章学习笔记----装配Bean 创建应用对象之间协作关系的行为通常称为装配(wiring).这也是依赖注入(DI)的本质. Spring配置的可选方案 当描述bean如何被装配时, ...
- 树莓派的WIFI配置
参考网址: http://www.cnblogs.com/iusmile/archive/2013/03/30/2991139.html http://my.oschina.net/pikeman/b ...
- 为什么mysqld启动报错
在一台ubuntu测试机器上启动一个mysql实例,本来应该是一件很简单的事情, 启动的时候却报错了: mysqld_safe --defaults-file=/etc/mysql/my3307. ...
- Python之tornado框架原理
Python web框架 1.简单概念 tornado socket.逻辑处理 Django flask 逻辑处理 第三方处理模块(包含了socket) jinja2模块 Models 数据库处理 V ...
- lintcode-108-分割回文串 II
108-分割回文串 II 给定一个字符串s,将s分割成一些子串,使每个子串都是回文. 返回s符合要求的的最少分割次数. 样例 比如,给出字符串s = "aab", 返回 1, 因为 ...
- lintcode-106-排序列表转换为二分查找树
106-排序列表转换为二分查找树 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 样例 标签 递归 链表 思路 类似于二分查找,每次将链表二分,中间节点作为根节点,在建立左子树 ...
- valgrind使用
参数配置 gcc -g: 增加调试信息,供valgrind精确定位. -O0:关闭gcc优化:优化产生的代码可能会造成valgrind误判. valgrind --leak-check=full no ...
- RadioGroup 的使用
//获取 RadioGroup 项目名称 procedure TForm1.RadioGroup1Click(Sender: TObject); begin Text := RadioGroup1 ...
- Concurrent.util中的一些类
package com.bjsxt.height.concurrent019; import java.io.IOException; import java.util.Random; import ...