记录编号 |
378046 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HZOI 2016]从零开始的序列 |
最终得分 |
100 |
用户昵称 |
YouSiki |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.085 s |
提交时间 |
2017-03-02 20:43:46 |
内存使用 |
6.65 MiB |
显示代码纯文本
- #include<bits/stdc++.h>
- #define siz (1<<20)
- #define frd fread(hd=buf,1,siz,stdin)
- #define gtc (hd==tl?(frd,*hd++):*hd++)
- char buf[siz],*hd=buf+siz,*tl=buf+siz;
- __inline void scan(int &r){
- r=0;static int c,f;
- for(c=gtc,f=0;c<48;c=gtc)if(c=='-')f=1;
- for(;c>47;c=gtc)r=r*10+c-48;if(f)r=-r;
- }
- #define max(a,b) (a>b?a:b)
- #define min(a,b) (a<b?a:b)
- #define rep(i,x,y) for(register int i=x;i<=y;++i)
- #define per(i,x,y) for(register int i=x;i>=y;--i)
- #define mxn 200005
- int n,a[mxn],b[mxn],f[mxn],s[mxn],v[mxn],g[mxn];
- __inline bool cmp(int i,int j){
- return a[i]>a[j];
- }
- __inline int find(int u){
- static int st[mxn],tt;
- while(u!=f[u])st[++tt]=u,u=f[u];
- while(tt)f[st[tt--]]=u;
- return u;
- }
- __inline void merge(int i,int j){
- i=find(i);j=find(j);f[i]=j;s[j]+=s[i];
- }
- main(){
- freopen("sky_seq.in","r",stdin);
- freopen("sky_seq.out","w",stdout);
- scan(n);
- rep(i,1,n)scan(a[i]),f[i]=b[i]=i,s[i]=1,g[i]=-1E9;
- std::sort(b+1,b+1+n,cmp);
- rep(i,1,n){int t=b[i];v[t]=1;
- if(v[t-1])merge(t-1,t);
- if(v[t+1])merge(t+1,t);
- t=find(t);g[s[t]]=max(g[s[t]],a[b[i]]);
- }
- per(i,n,1)g[i]=max(g[i+1],g[i]);
- rep(i,1,n)printf("%d ",g[i]);puts("");
- return fclose(stdout),0;
- }