CH Round #45 能量释放
能量释放 CH Round #45 - alan有一些陷阱 III
题目描述
alan得到一块由个能量晶体构成的矿石,对于矿石中的每一个能量晶体,如果用化学物质刺激某一个能量晶体,就能使它释放能量。
它的能量释放强度与晶体本身的能量值以及能量晶体的位置
有关。
为了方便研究,alan做了如下的定义。
能量集:一块矿石中的第
个能量晶体到第
个能量晶体(包含
和
,
)构成的集合。
能量储存点:对于一块矿石中的能量晶体
和
,若有
,则称
是
能量储存点。
能量释放点:在一个能量集中,若存在一个能量晶体,使得除它之外的所有能量晶体都是它的能量储存点,则称这个能量晶体是该能量集的能量释放点。
能量释放强度:对于一个能量集中的能量释放点来说,刺激这个能量晶体,该能量集中其余能量晶体会释放能量。该能量集的能量释放强度就等于该能量集中其余某个能量晶体的能量值与能量释放点的能量值的差的最大值。而第
个能量晶体的能量释放强度则是
所在的所有能量集的能量释放强度的最大值。
alan将给出矿石中能量晶体的个数,以及每个能量晶体的能量值
,要求你求出每个能量晶体的能量释放强度。
输入格式
第一行1个整数,表示矿石中能量晶体的个数。
第二行个整数,第
个整数表示第
个能量晶体的能量值
。
输出格式
仅包含一行个整数,第
个整数表示第
个能量晶体的能量释放强度。
样例输入
5
3 2 1 2 3
样例输出
0 1 2 1 0
数据范围与约定
- 对于20%的数据:
。
- 对于60%的数据:
。
- 对于100%的数据:
。
- 温馨提醒:本题数据量较大,请尽量使用输入输出优化。
题解:
在考场上我写的是O(n)的单调队列(其实也相当于是单调栈。。。)+O(nlogn)的rmq
自己为能AC,结果只有一半
后来才知道如果数据规模达到百万以上,就一定得用O(n)的算法了,我还是太年轻啊。。。
今天准备做NOI2005瑰丽的华尔兹时,又用到了单调队列,忽然对这题有了想法,就又来做
这次我的算法,均摊应该是O(n)的吧。。。我想是这样。。。
其实考虑到a[i]左边的元素如果比a[j]小的话,那 j 管辖的范围 i 也也一定可以,(j 的初始值为 i-1)
所以我们直接跳到 j 管辖的范围的左边即可,即 j=l[j]-1 同时用 它来更新f[i]
最后跳不动的时候,j+1就是 l[i]
右边类似。。。
不知到复杂度是多少?怎么估计?求大神指教
自测稍有超时,后几个点都是1.2s左右的样子
代码:
1.考场 跑完所有数据需要 22s
var i,j,n,h,t:longint;
f:array[..+,..] of longint;
a,q,l,r:array[..+] of longint;
procedure init;
begin
readln(n);
for i:= to n do read(a[i]);
end;
procedure queue;
begin
a[]:=-;a[n+]:=a[];
fillchar(q,sizeof(q),);
h:=;t:=;
for i:= to n+ do
begin
while (h<t) and (a[i]<a[q[t]]) do
begin
r[q[t]]:=i-;
dec(t);
end;
inc(t);q[t]:=i;
end;
fillchar(q,sizeof(q),);
h:=;t:=;
for i:=n downto do
begin
while (h<t) and (a[i]<a[q[t]]) do
begin
l[q[t]]:=i+;
dec(t);
end;
inc(t);q[t]:=i;
end;
end;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end; procedure rmq;
begin
fillchar(f,sizeof(f),);
for i:= to n do f[i,]:=a[i];
for i:= to do
begin
if (<<i)>n then break;
for j:= to n-(<<i)+ do
f[j,i]:=max(f[j,i-],f[j+<<(i-),i-]);
end;
end;
function query(x,y:longint):int64;
var k:longint;
begin
k:=trunc(ln(y-x+1.0)/ln(2.0));
exit(max(f[x,k],f[y-(<<k)+,k]));
end; procedure main;
begin
queue;
rmq;
// for i:= to n do writeln(l[i],' ',r[i]);
for i:= to n do
write(query(l[i],r[i])-a[i],' ');
end;
begin
assign(input,'input.txt');assign(output,'output.txt');
reset(input);rewrite(output);
init;
main;
close(input);close(output);
end.
2.20140806 跑完所有数据需要 6s
{$inline on}
const maxn=+;
var l,r,a,f:array[..maxn] of longint;
i,n,j:longint;
function max(x,y:longint):longint;inline;
begin
if x>y then exit(x) else exit(y);
end;
procedure init;
begin
readln(n);
for i:= to n do begin read(a[i]);f[i]:=a[i];end;
end;
procedure main;
begin
a[]:=-maxlongint;a[n+]:=-maxlongint;
l[]:=;
for i:= to n do
begin
j:=i-;
while a[i]<=a[j] do
begin
if f[j]>f[i] then f[i]:=f[j];
j:=l[j]-;
end;
l[i]:=j+;
end;
r[n]:=n;
for i:=n- downto do
begin
j:=i+;
while a[i]<=a[j] do
begin
if f[j]>f[i] then f[i]:=f[j];
j:=r[j]+;
end;
r[i]:=j-;
end;
for i:= to n- do write(f[i]-a[i],' ');writeln(f[n]-a[n]);
end;
begin
assign(input,'input.txt');assign(output,'output.txt');
reset(input);rewrite(output);
init;
main;
close(input);close(output);
end.
CH Round #45 能量释放的更多相关文章
- 从lca到树链剖分 bestcoder round#45 1003
bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或) ...
- CH Round #52 还教室[线段树 方差]
还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...
- CH Round #72树洞[二分答案 DFS&&BFS]
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...
- CH Round #30 摆花[矩阵乘法]
摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...
- contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve
http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...
- CH Round #17 舞动的夜晚
舞动的夜晚 CH Round #17 描述 L公司和H公司举办了一次联谊晚会.晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞.在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的 ...
- CH Round #57 - Story of the OI Class 凯撒密码
很有意思的一道题目 考场上想的是HASH成一个整数,把末位asicc码值*1,依次乘*10,得到一个整数,然后利用等差性.唯一性快排Nlogn乱搞的 证明如下: 对于明文abcde 密文 bcdef ...
- CH Round #56 - 国庆节欢乐赛解题报告
最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...
- CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告
T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7 ...
随机推荐
- JavaScript之数据类型
1. 种类 5种基本类型:Number.String.Null.Undefined.Boolean 1种对象类型:Object(Function.Array.Date) 特别注意:当把基本类型尝试以对 ...
- c#中的重写方法与隐藏方
1.父类中有方法a,添加virtua修饰符可声明为虚方法,在子类中可以用override声明后重写方法a. 2.父类中有方法a,在子类中可以有new修饰符声明后隐藏父类方法. 子类重写方法后,对于子类 ...
- PIMP模式的理解
看了[C++程序设计技巧]Pimpl机制 之后,想了半天才理解 // MyClass.h 2: class MyClassImpl; // forward declaration 3: clas ...
- C#获取时间戳的问题
最近在做一个接口,需要用到时间戳,在请求接口时,返回超时,接口方的技术称是时间戳的不对(超出一定范围[比如1分钟]就返回超时)导致的. 首先,看代码: public static double Get ...
- 开始学习requirejs+easyui的使用.
开始学习requirejs+easyui的使用. 目录结构: |-project |-easyui01 |-js |-main.js |-index.html |-libs libs目录下放入的是ea ...
- 利用Xlinix SDK 建立Linux程序以及对该程序进行调试
一.创建Linux程序 1. 点击File > New > Application Project .并参照下图设置. 2. 输入工程名,并选择存储路径. 3. 选择所需的操作系统平台(O ...
- 关于Navicat导入MySQL数据库遇到的一些问题
今天本想将之前的一个数据库easy.sql用图形化工具Navicat导入的,开始是用“运行SQL文件”导入,结果是“queries successfully”啥的,去查是否导表成功,一看并没有. 结果 ...
- mysql导入导出.sql文件 备份还原数据库
从数据库导出数据库文件: 进入你的MySQL的安装目录的bin目录或者在C盘的根目录都行,我选的是在bin目录下,下面的例子出第一个外将以在C盘的根目录来讲解 我的mysql安装在了C盘,C: ...
- jquery.maskload.js学习笔记
概述 Loadmask是一个jquery plugin,使用此插件可以在DOM元素加载或更改内容时为此DOM元素添加一个屏蔽层,以防止用户互动,同时起到提醒用户后台任务正在运行的作用. 使用此插件可以 ...
- Google Map 自定义 infowindow
最近做的东西用到了infowindow,不过google提供的样式太难看了,于是想改变一下样式.看了一下好像infowindow的样式不太好改. 查了半天资料,看到一个infobox,感觉真的挺好用. ...