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 ...
随机推荐
- Asp.Net部分面试题
HTML.javascript部分 1. jQuery的美元符号$有什么作用? 答:个人理解:$指代jquery对象,拥有jquery对象所有的属性和成员 网友理解:在Jquery中,$是JQuery ...
- html-----009
</head> <!-- 通过使用框架,你可以在同一个浏览器窗口中显示不止一个页面. <p> 垂直框架</p> 本例演示:如何使用三份不同的文档制作一个垂直框 ...
- (hdu)1285 确定比赛名次
Problem Description 有N个比赛队(<=N<=),编号依次为1,,,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接 ...
- CentOS6.5下docker的安装及遇到的问题和简单使用
Docker是一个开源的应用容器引擎,可以轻松的为任何应用创建一个轻量级的.可移植的.自给自足的容器.利用Linux的LXC.AUFS.Go语言.cgroup实现了资源的独立,可以很轻松的实现文件.资 ...
- CentOS6.6源码编译升级GCC至4.8.2
升级前提 源码编译需要至少要有一个可用的gcc编译器. 可以用过yum自动安装或者手动下载rpm包安装. 通过yum可以看到至少需要下面这些安装包,所以可以到许多rpm package站点中搜索下载相 ...
- Omnithreadlibary学习(1)-异步执行
program main; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, OtlParallel; begin Parallel.Async( ...
- python开发-web框架之diango-----Models
这篇博客是紧连上一篇博客的,因为内容较多,这里介绍的是Models这一部分的内容 七:Models 数据库的配置 1 django默认支持sqlite,mysql, oracle,postgre ...
- Qt之json解析
Jsoner::Jsoner(QObject *parent) : QObject(parent){ QJsonObject json; json.insert("loginna ...
- USB Key插入和移除监控
近期在做USB Key插入和移除监控,已经做到了插入和移除USB Key时,程序能够及时感应到. 如下为源代码: private void Form1_Load(object sender, Even ...
- .net source code
.NET 类库的强大让我们很轻松的解决常见问题,作为一个好专研的程序员,为了更上一层楼,研究CLR的基础类库实现是快速稳定的捷径. 一般场景下,采用 Reflector可以反射出.NET 的部分实现出 ...