10分求调
查看原帖
10分求调
1012483
maxlmb2023楼主2024/7/23 16:07
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
struct node
{ 
	int l, r, num;
}a[N];
struct nodek
{
	int l, r, st, en, le;
}b[N];
int main()
{
    ios::sync_with_stdio(0);
	int n;
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i].num;
	int t = 1, cur = 0, start = 1;
	a[0].r = 1, b[0].r = 1;
	a[1].l = 0, a[1].r = 2;
	for(int i = 2; i <= n; i++)
	{
		a[i].l = i - 1, a[i].r = i + 1;
		if(a[i].num == a[i-1].num) t++;
		else
		{
			++cur;
			nodek k;
			k.l = cur - 1, k.r = cur + 1, k.st = start, k.le = t, k.en = i - 1;
			b[cur] = k;
			t = 1, start = i;
		}
	}
	++cur;
	nodek k;
	k.l = cur - 1, k.r = cur + 1, k.st = start, k.le = t, k.en = n;
	b[cur] = k;
	a[n].r = 0;
	b[cur].r = 0;
	int c = n;
	while(c)
	{
		for(int i = b[0].r; i; i = b[i].r)
		{
		//	printf("b[%d]:l=%d, r=%d, st=%d, en=%d, le=%d\n", i, b[i].l, b[i].r, b[i].st, b[i].en, b[i].le);
			for(int j = b[i].st; j <= b[i].en; j++)
				if(a[j].num == a[b[i].st].num)
				{
					cout << j << ' ';
					a[a[j].l].r = a[j].r;
					a[a[j].r].l = a[j].l;
					b[i].st = j + 1, b[i].le--;
					c--;
					break;
				}
			
			
			if(b[i].le == 0)
			{
				if(a[b[b[i].l].st].num == a[b[b[i].r].st].num)
				{
					b[b[i].l].r = b[b[i].r].r;
					b[b[i].l].en = b[b[i].r].en;
					b[b[i].l].le += b[b[i].r].le;
				}
				else
				{
					b[b[i].l].r = b[i].r;
					b[b[i].r].l = b[i].l;
				}
			}
		}
		cout << endl;
	}
}

10分,#1-#5tle,#6wa,#7ac,#8-#10re......

2024/7/23 16:07
加载中...