RT,考场代码,感觉是 O(nlogn),各自测网站的民间弱数据也跑的飞快,但是还是不会算
代码如下,求神仙帮忙分析qwq
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=1073741823;
const ll inff=(1ll<<60);
const int N=200005;
#define pii pair<int,int>
#define pb push_back
#define fir first
#define sec second
//#define int ll
inline int read(){
int x=0,f=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();
return x*f;
}
int n,c[N],out[N],target[N],le;
int a[5][N],cnt[5];
int main(){
//freopen("fruit.in","r",stdin);
//freopen("fruit.out","w",stdout);
n=read();
for(int i=1;i<=n;i++)c[i]=read();
c[0]=-1;
for(int i=1;i<=n;i++)
a[c[i]][++cnt[c[i]]]=i;
a[0][++cnt[0]]=n+1;
a[1][++cnt[1]]=n+1;
int res=n;
le=1;
while(res){
int i=le;
while(i<=n){
printf("%d ",i);
out[i]=1;
res--;
int tar=(!c[i]);
if(c[i] == c[i-1]){
target[i] = min(target[i-1] + 1,cnt[tar]);
}
else{
int l=1,r=cnt[tar];
int x=n+1;
while(l<=r){
int mid=(l+r)>>1;
if(a[tar][mid] > i)x=min(x,mid),r=mid-1;
else l=mid+1;
}
while(out[a[tar][x]]) x++;
target[i]=x;
}
while(out[a[tar][target[i]]]) target[i]++;
i=a[tar][target[i]];
}
while(out[le])le++;
puts("");
}
return 0;
}