郁闷的蒟蒻
查看原帖
郁闷的蒟蒻
244175
Plex楼主2021/10/31 13:52
#include<bits/stdc++.h>
using namespace std;
#define M 200005
int n,sum=1,a[M];
struct Node
{
	int begin=-1,end=-1;
	int pre=0,nex=0;
	bool flag=false;//区间是否存在
};
Node F[M];
bool empty=true;
void del(const int &num)
{
	F[num].begin=-1;F[num].end=-1;
	F[num].flag=false;
	F[F[num].nex].pre=F[num].pre;
	F[F[num].pre].nex=F[num].nex;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&a[i]);
	}
	F[1].begin=1;F[1].end=1;F[1].flag=true;
	for(int i=2;i<=n;++i)
	{
		if(a[i]==a[i-1]) F[sum].end++;
		else
		{
			++sum;
			F[sum].begin=i;F[sum].end=i;F[sum].flag=true;
			F[i].pre=sum-1;F[i].nex=sum+1;
		}
	}
	/*
	for(int i=1;i<=sum;++i) printf("%d %d\n",F[i].begin,F[i].end);
	return 0;
	*/
	while(1)
	{
		empty=true;
		for(int i=1;i<=sum;++i)
		{
			if(F[i].flag)
			{
				printf("%d ",F[i].begin);
				F[i].begin++;
			}
		}
		for(int i=1;i<=sum;++i)
		{
			if(F[i].begin>F[i].end)
			{
				del(i);
				++empty;
			}
		}
		for(int i=1;i<=sum;++i)
		{
			if(F[i].flag&&F[F[i].pre].flag&&a[F[i].begin]==a[F[F[i].pre].end])
			{
				F[i].begin=F[F[i].pre].begin;
				del(i);
			}
		}
		for(int i=1;i<=sum;++i)
		{
			if(F[i].flag) empty=false;
		}
		if(empty) break;
		printf("\n");
	}
	return 0;
}

看起来 似乎 没有问题

2021/10/31 13:52
加载中...