单调栈搞一下。时间卡得好紧,printf输出单字符好慢,要用putchar。
#include<bits/stdc++.h>
using namespace std;
void read(int&a){
char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
}
inline void prin_d(int x)
{
if (x > 9)
{
prin_d(x / 10);
}
putchar(x % 10 + '0');
return ;
}
const int MAXN=200200;
int a[MAXN],minlef[MAXN],minrig[MAXN],ans[MAXN];
struct node
{
int pos,x;
}stk[MAXN];
int main()
{
long long n,i,stknum;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
read(a[i]);
stknum=0;
memset(ans,0,sizeof(ans));
for(i=1;i<=n;i++)
{
while(stknum&&stk[stknum-1].x>a[i])
{
minrig[stk[stknum-1].pos]=i-1;
stknum--;
}
stk[stknum].pos=i;
stk[stknum].x=a[i];
stknum++;
}
while(stknum)
{
minrig[stk[stknum-1].pos]=n;
stknum--;
}
for(i=n;i>=1;i--)
{
while(stknum&&stk[stknum-1].x>a[i])
{
minlef[stk[stknum-1].pos]=i+1;
stknum--;
}
stk[stknum].pos=i;
stk[stknum].x=a[i];
stknum++;
}
while(stknum)
{
minlef[stk[stknum-1].pos]=1;
stknum--;
}
for(i=1;i<=n;i++)
ans[minrig[i]-minlef[i]+1]=max(ans[minrig[i]-minlef[i]+1],a[i]);
for(i=n-1;i>=1;i--)
ans[i]=max(ans[i],ans[i+1]);
for(i=1;i<=n;i++)
{
prin_d(ans[i]);
putchar(' ');
}
printf("\n");
}
}