如果复杂度不对跟我说一下优化方法,#8#9TLE,本题测出来 5s 左右(尝试5s卡常过ls,真有我的喔)
#include<bits/stdc++.h>
//#define int long long
#define debug puts("qwq");
#define inf 0x3f3f3f3f
#define infi 0x3f3f3f3f3f3f3f3fll
#define up(i,x,y) for(register int i=x;i<=y;++i)
#define dn(i,x,y) for(register int i=x;i>=y;--i)
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f;}
inline void write(int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10|48);}
inline void writeln(int x){write(x),putchar('\n');}
inline void writesp(int x){write(x),putchar(' ');}
inline void getstr(string &str,char endy='\n'){str="";char ch=getchar();while(ch<32||ch>127||ch==endy)ch=getchar();while(ch>=32&&ch<=127&&ch!=endy)str+=ch,ch=getchar();}
inline void putstr(string str,char endy='\n'){up(i,0,str.length()-1)putchar(str[i]);putchar(endy);}
inline void fre(){freopen("P7912_8.in","r",stdin),freopen("P7912_8.txt","w",stdout);}
int pre[200005],nxt[200005],col[200005],a[200005],xcznxt[200005],head=1;vector<int>block[200005];
struct node{int l,r;};
signed main(){
fre();
int n=read(),tot=0,dead=0;
up(i,1,n)a[i]=read();
a[0]=2;
up(i,1,n)if(a[i-1]!=a[i])block[++tot].push_back(i),col[tot]=a[i],pre[tot]=tot,nxt[tot]=tot;else block[tot].push_back(i);
up(i,1,tot)reverse(block[i].begin(),block[i].end());
up(i,1,tot)xcznxt[i]=i+1;
xcznxt[tot]=0;
while(1){
for(register int i=head;i;i=xcznxt[i])if(pre[i]==i)writesp(block[i].back()),block[i].pop_back(),++dead;
if(dead>=n)break;
int prev=0,flag=1;
for(register int i=head;i;flag?i=xcznxt[i]:i=i){
if(!block[i].size()){
int nxter=xcznxt[i];
if(i==head){
int nhead=xcznxt[head];
xcznxt[head]=head;
head=nhead;
}else xcznxt[prev]=xcznxt[i],xcznxt[i]=i;
if(nxt[i]!=i)pre[nxt[i]]=nxt[i],nxt[i]=i;
i=nxter,flag=0;
}else prev=i,flag=1;
}vector<node>lis;node tmp;
for(register int i=head;i;i=xcznxt[i]){
if(pre[i]==i)tmp.l=i;
if(nxt[i]==i)tmp.r=i,lis.push_back(tmp);
}tmp.l=0,tmp.r=0;
for(auto i:lis){
if(!tmp.l&&!tmp.r){tmp=i;continue;}
if(col[tmp.l]==col[i.l]){
nxt[tmp.r]=i.l;
pre[i.l]=tmp.r;
}tmp=i;
}puts("");
}return 0;
}