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 ...
随机推荐
- C++:memset ,memcpy 和strcpy 的根本区别!
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h&g ...
- static与get属性的作用
一.Static 用于没有属性的类中,不用保存属性的值,例如 var user=new User(): user.Name="jack" 可以直接调用类中的方法,避免需要多次访问该 ...
- xcode插件安装完之后无法使用问题解决
1.打开xcode插件所在的目录: 例如: ~/wangdi/library/Application Support/Developer/Shared/Xcode/Plug-ins /Users/su ...
- Xamarin.iOS - 利用Settings插件与EAIntroView制作App的欢迎界面
Xamarin.iOS - 利用Settings插件与EAIntroView制作App的欢迎界面 关于欢迎界面 很多App第一次启动都会有一个欢迎界面,欢迎界面往往决定这用户对App的第一映像,所以欢 ...
- spring Aop 注解
个人理解: spring Aop 是什么:面向切面编程,类似于自定义拦截操作,支持拦截之前操作@Before,拦截之后操作@After,拦截环绕操作@Around. 什么情况下使用spring Aop ...
- 02_天气查询_socket方式模拟_单线程
[远程请求的B/S模式(客户端/服务器)] TCP: 是一种传输层协议,一种面向连接的协议.经过三次握手客户端和服务器端连接一个连接(通道).提供可靠的数据传输,该协议一般服务质量要求比较高的情况,T ...
- 使用 Virtual Box 安装 android x86
1.安装 跟随别人的教程:http://www.maketecheasier.com/run-android-4-3-in-virtualbox/ 2.问题 安装过程出现以下问题:Kernel pan ...
- v4l2简介
V4L是linux内核中关于视频设备的子系统,为linux下的视频驱动提供了统一的接口,使应用程序可以使用统一的API操作不同的视频设备,简化视频系统的开发与维护 V4L2相比与V4L有更好的扩展性和 ...
- cmake,gtest单元测试程序
参考:http://blog.csdn.net/stdcoutzyx/article/details/8284183 PROJECT (HELLO) SET(SRC_LIST main.c) MESS ...
- js生成随机字符串或者随机数
//返回一个指定范围内的随机数 function createRandomNum(Min,Max){ let Range = Max - Min; let Rand = Math.random(); ...