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 时不 ...
随机推荐
- Spring MVC 开发 配置
1.首先在web.xml中配置一个DispatcherServlet,并通过<servlet-mapping>指定需要拦截的url. 下面xml中配置一个拦截.html为后缀的url. & ...
- jenkins安全内容配置策略
有时我们使用HTML Publisher Plugin插件时,在jenkins点开html report,会发现没有带任何的css或js样式,这是因为Jenkins 1.641 / Jenkins 1 ...
- spring 给静态变量注入值
一般在spring中,给static变量加上@Autowired注解的时候会报空指针异常错误. 解决: 1.通过xml配置文件配置 这个就不多说了. 2.通过注解 @Component public ...
- Jenkins - 持续集成部署
1. 安装svn:用于checkout源码 (1)yum 安装:yum -y install subversion (2)查看svn版本信息:svnserver --version 2. 安装jdk ...
- 1030 Travel Plan (30 分)(最短路径 and dfs)
#include<bits/stdc++.h> using namespace std; ; const int inf=0x3f3f3f3f; int mp[N][N]; bool vi ...
- IDE API SDK JDK
一.IDE 英文全称:Integrated Development Environment 中文名称:集成开发环境 本质:应用程序 功能:提供程序开发环境 组成:代码编辑器.编译器.调试器.图形用户界 ...
- mac下管理论文的工具
作者:丁香园站友@dlzhangyu链接:http://paper.dxy.cn/article/509726本网站所有注明“来源:丁香园”的文字.图片和音视频资料,版权均属于丁香园所有,非经授权,任 ...
- springMVC js等文件找不到解决方法
<mvc:resources mapping="/javascript/**" location="/static_resources/javascript/&qu ...
- Intellij IDEA 系统路径配置
在使用IDEA启动Tomcat的时候,会读取系统路径,默认路径可能不是我们想要的,可以修改 C:\MyPrograms\IntelliJ IDEA 14.0.1\bin\idea.properties ...
- 【bzoj4517】[Sdoi2016]排列计数 组合数+dp
题目描述 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条 ...