Solution
这道题目我们可以先把一块的缩成一个点,比如说1 1 1 0 0,我们可以用两个数组表示,一个是1 0,另一个是3 2,还要记录以下头和尾,方便输出。
然后我们就用两个数组,一个指向上一块,一个指向下一块。
每次都将每个区间减去1,在判断一下是否还有水果,如果没有,就将他的上一位指向他的下一位,让他的下一位指向他的上一位,输出就把他的头输出就可以了,头记得加1。
Code
#include<bits/stdc++.h>
using namespace std;
int n,a[200005],m,t[200005],w[200005],last[200005],nxt[200005],kind[200005],bz[200005];
int main()
{
// freopen("fruit.in","r",stdin);
// freopen("fruit.out","w",stdout);
int len=1,first=1;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) last[i]=i-1,nxt[i-1]=i;
for(int i=2;i<=n;i++)
if(a[i]!=a[i-1])
m++,t[m]=first,w[m]=i-1,len=1,first=i,kind[m]=a[i-1];
m++,t[m]=first,w[m]=n,kind[m]=a[n];
len=n;
while(len)
{
for(int i=nxt[0];i<=m;i=nxt[i])
{
if(i==0) break;
if(kind[i]==kind[last[i]]&&last[i]!=0) continue;
if(last[i]!=0) printf(" ");
printf("%d",t[i]),len--,t[i]++;
}
for(int i=1;i<=m;i=nxt[i])
if(t[i]>w[i]) nxt[last[i]]=nxt[i],last[nxt[i]]=last[i];
printf("\n");
}
return 0;
}