能量释放 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. WPF:保存窗口当前状态截图方法

    在制作软件使用手册或者操作示范市,比较常用方式有截图和视频制作.如果软件内置当前状态的截图和操作视频的导出功能,则将极大简化这方面的工作.使用wpf编写的UI界面,截图的导出功能逻辑相对简单,通用的实 ...

  2. jdbc的封装

    package com.wjf.helper; import java.io.FileInputStream; import java.io.FileOutputStream; import java ...

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

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

  4. MongoDB笔记(五)深入学习

    系列一:http://www.cnblogs.com/huangxincheng/category/355399.html系列二:http://www.cnblogs.com/lipan/catego ...

  5. 【原创】Android开发使用华为手机调试logcat没有应用输出信息

    输入 *#*#2846579#*#* 点击project Menu点击后台 1.设置logcat 2. Dump & Log",打开开关"打开Dump & Log& ...

  6. WinForm TreeView 三种状态

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { var node = e.N ...

  7. MIS框架开发计划

    计划开发模块 缓存模块 全球化模块(时间转换.货币转换.语言切换.度量转换.时区转换) 用户模块 用户短消息模块 日志模块(系统日志.用户操作日志.安全审计日志) 权限模块 配置模块 事件模块(观察者 ...

  8. MarkDown教程

    MarkDown笔记 在线编辑器其他教程 [1.标题] 标题1 标题1=== 标题2 标题2--- 标题3 1 2 3 4 5 6 7 7 #1 ##2 ###3 ####4 #####5 ##### ...

  9. php 遍历一个文件夹下的所有文件和子文件夹

    <?php function my_scandir($dir) { $files=array(); if(is_dir($dir)) { if($handle=opendir($dir)) { ...

  10. 集合工具类 - CollectionUtil.java

    集合工具类,提供数组转LIST.数组转SET.合并集合.计算笛卡儿积等方法. 源码如下:(点击下载 -  CollectionUtil.java.ArrayUtil.java.commons-lang ...