#include<bits/stdc++.h>
using namespace std;
const int maxN = 2e5 + 5;
struct Fruit
{
int type;
int Next;
int tail;
}fruit[maxN];
int main()
{
//freopen("test.in", "r", stdin);
int n;
scanf("%d", &n);
fruit[0].type = -1;
vector<int> headVec;
int head = -1;
for(int i = 1; i <= n; i++)
{
scanf("%d", &fruit[i].type);
if(fruit[i].type != fruit[i - 1].type)
{
headVec.push_back(i);
head = i;
}
else
{
fruit[i - 1].Next = i;
fruit[head].tail = i;//head是链表的首元素位置,tail是尾元素位置
}
}
int pickCnt = 0;
while(pickCnt < n)
{
vector<int> tmpHeadVec;
for(int i = 0; i < (int)headVec.size(); i++)
{
head = headVec[i];
printf("%d ", headVec[i]);
pickCnt++;
int nxt = fruit[head].Next;
if(0 == nxt)
{
continue;
}
if(tmpHeadVec.empty() || fruit[tmpHeadVec.back()].type != fruit[nxt].type)//标记下一轮各个链表里的首元素
{
tmpHeadVec.push_back(nxt);
fruit[nxt].tail = fruit[head].tail;
}
else if(fruit[tmpHeadVec.back()].type == fruit[nxt].type) //合并链表
{
int lastHead = tmpHeadVec.back();
int lastTail = fruit[lastHead].tail;
fruit[lastTail].Next = nxt;
fruit[lastHead].tail = fruit[head].tail;
}
}
printf("\n");
headVec = tmpHeadVec;
}
return 0;
}
P7912 [CSP-J 2021] 小熊的果篮
最新推荐文章于 2024-04-19 17:56:26 发布