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;
}