【CSP-J2021普及组】T4 小熊的果篮

Solution

这道题目我们可以先把一块的缩成一个点,比如说1 1 1 0 0,我们可以用两个数组表示,一个是1 0,另一个是3 2,还要记录以下头和尾,方便输出。
然后我们就用两个数组,一个指向上一块,一个指向下一块。
每次都将每个区间减去1,在判断一下是否还有水果,如果没有,就将他的上一位指向他的下一位,让他的下一位指向他的上一位,输出就把他的头输出就可以了,头记得加1。

Code

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

你可能感兴趣的:(题解,其他)