Terrasse @ 2018-07-18 19:46:04
#include<iostream>
#define MAXN 1000010
using namespace std;
int q[MAXN],idq[MAXN],idp[MAXN],p[MAXN];//分别是min队列、max队列及其中元素的序号
int ans[MAXN],ql=0,qr=-1,pl=0,pr=-1,n=0,k=0;//ql、qr是q队列的左端点、右端点,p队列同理
int main()
{
int i=1,a=0;
ios::sync_with_stdio(0);
cin>>n>>k;
for(i=1;i<=n;i++)
{
cin>>a;
for(;qr>=ql && q[qr]>=a;qr--);
q[++qr]=a;
idq[qr]=i;
if(idq[ql]+k==i)
{
ql++;
}
for(;pr>=pl && p[pr]<=a;pr--);
p[++pr]=a;
idp[pr]=i;
if(idp[pl]+k==i)
{
pl++;
}
if(i<k)
{
continue;
}
cout<<q[ql]<<' ';
ans[i]=p[pl];//max与min同时计算,留到最后输出
}
cout<<endl;
for(i=k;i<=n;i++)
{
cout<<ans[i]<<' ';
}
cout<<endl;
return 0;
}
大佬们请不要嫌弃蒟蒻的码风,帮忙看看怎么优化吧、、原则上不打算开O(2),毕竟NOIP不允许。
by Llf0703 @ 2018-07-18 19:47:17
@冰河世纪_朱 使用快读啊
by Terrasse @ 2018-07-18 19:58:11
@Llf0703 这。。有600ms左右时间费在读入上啊、、从今天起正式入坑快读
by colazcy @ 2018-07-18 20:15:55
这题可以氧气线段树强行怼过(逃
by tocek_shiki @ 2018-07-18 20:48:41
@冰河世纪_朱 不一定要快读啊
你可以在main函数里加上一句
by Terrasse @ 2018-07-19 09:41:10
@fff团666 本来就加了的,,请看第九行,完全比不上快读。。
by Terrasse @ 2018-07-19 09:42:08
@colazcy 想过线段树,主要是想试试O(n)算法
by tocek_shiki @ 2018-07-19 18:13:12
@冰河世纪_朱 有趣。。。
看来再也不能用cin了
by Terrasse @ 2018-07-19 18:33:01
@fff团666 是啊,以后我看到100W个以上的数就会想到快读了。
by tocek_shiki @ 2018-07-19 19:13:48
@冰河世纪_朱 手写read了解一下
by Terrasse @ 2018-07-19 19:18:15
@fff团666 啊?没听懂。。read()除了手写还能怎么?