能量释放 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 能量释放的更多相关文章

  1. 从lca到树链剖分 bestcoder round#45 1003

    bestcoder round#45 1003 题,给定两个点,要我们求这两个点的树上路径所经过的点的权值是否出现过奇数次.如果是一般人,那么就是用lca求树上路径,然后判断是否出现过奇数次(用异或) ...

  2. CH Round #52 还教室[线段树 方差]

    还教室 CH Round #52 - Thinking Bear #1 (NOIP模拟赛) [引子]还记得 NOIP 2012 提高组 Day2 中的借教室吗?时光飞逝,光阴荏苒,两年过去了,曾经借教 ...

  3. CH Round #72树洞[二分答案 DFS&&BFS]

    树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...

  4. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  5. contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve

    http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...

  6. CH Round #17 舞动的夜晚

    舞动的夜晚 CH Round #17 描述 L公司和H公司举办了一次联谊晚会.晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞.在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的 ...

  7. CH Round #57 - Story of the OI Class 凯撒密码

    很有意思的一道题目 考场上想的是HASH成一个整数,把末位asicc码值*1,依次乘*10,得到一个整数,然后利用等差性.唯一性快排Nlogn乱搞的 证明如下: 对于明文abcde 密文 bcdef ...

  8. CH Round #56 - 国庆节欢乐赛解题报告

    最近CH上的比赛很多,在此会全部写出解题报告,与大家交流一下解题方法与技巧. T1 魔幻森林 描述 Cortana来到了一片魔幻森林,这片森林可以被视作一个N*M的矩阵,矩阵中的每个位置上都长着一棵树 ...

  9. 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 ...

随机推荐

  1. MathType支持64位 WIN 7Office 2013(完美解决)(转载)

    经过几次尝试解决了,方法如下: 1. 安装MathType 6.8 (别的版本不知是否适用,本人安装的是该版本) 2. 将以下两个文件拷贝出来 C:\Program Files (x86)\MathT ...

  2. 国庆第六日(2014年10月6日11:51:15),node-webkit,理财产品

    (1)node-webkit:一篇很好的入门文章.入门.系列. 在window下的打包和运行.大漠的一篇讲解文章 . (2)lighttable: 官网. (3)现在的理财产品,雨后春笋般冒出:宝点网 ...

  3. 学习笔记---C++析构函数心得

    1.动态分配的对象的析构函数 class man{ public: man(){ cout<<"man begin"<<endl; }; ~man(){ c ...

  4. Git for Windows

    本篇文章由:http://www.sollyu.com/git-for-windows/ 说明 Git是用于Linux内核开发的版本控制工具.与CVS.Subversion一类的集中式版本控制工具不同 ...

  5. cocos2dx如何添加popScene的场景动画

    说明 我们很容易在pushScene中添加动画 Director::getInstance()->pushScene(TransitionSlideInB::create(SCENE_TIME, ...

  6. 修复Windows7的便签问题

    工作的时候,喜欢利用Windows的附件“便签”,将自己要做的事情一一列在上面,显示在桌面上, 今天突然发现便签损坏,系统是元数据损坏,后来在网上查到解决方法,特此记录: 1. 以管理员身份运行 cm ...

  7. [开发环境] Ubuntu12.04 Telnet服务设置

    Ubuntu12.04默认未启用Telnet服务,配置Telnet服务步骤如下: 1. 安装和配置 安装openbsd-inetd: #sudo apt-get install openbsd-ine ...

  8. char *s = getpass()屏幕不回显示 ,返回输入的字符

    char *s = getpass(“please input you name:”)屏幕不回显示 ,返回输入的字符

  9. 内容写到 csv 格式的文件中 及 读取 csv 格式的文件内容

    <?php/*把内容写到 csv 格式的文件中 基本思路是:1.用 $fp = fopen("filename", 'mode')打开一个csv文件,可以是打开时才建立的2. ...

  10. js 中用Dom2级事件处理函数(改变样式)

    下面这些客户端 javascript代码用到了事件,它给一个很重要的事件--“load" 事件注册了一个事件处理程序.同时展示了注册”click“事件处理函数更高级的一种方法 <!do ...