AcWing 4089. 小熊的果篮
原题链接
困难
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, groupSizes[N], elements[N], previousValue = -1, uniqueGroupsCount, totalGroups;
queue<int> groupQueues[N];
// 递归处理队列中的元素并输出
void processGroups() {
for (int i = 1; i <= totalGroups; ++i) {
cout << groupQueues[elements[i]].front() << " "; // 输出队列中的第一个元素
groupQueues[elements[i]].pop(); // 移除已输出的元素
}
cout << endl;
int newLen = 0, mergeFlag = 0; // mergeFlag用于标记是否进行队列合并
for (int i = 1; i <= totalGroups; ++i) {
if (groupQueues[elements[i]].empty()) {
mergeFlag = !mergeFlag; // 如果队列为空,切换合并标记
continue;
}
if (newLen == 0) {
groupSizes[++newLen] = groupQueues[elements[i]].size();
elements[newLen] = elements[i];
mergeFlag = 0;
continue;
}
if (mergeFlag == 0) {
groupSizes[++newLen] = groupQueues[elements[i]].size();
elements[newLen] = elements[i];
} else {
groupSizes[newLen] += groupQueues[elements[i]].size();
while (!groupQueues[elements[i]].empty()) {
groupQueues[elements[newLen]].push(groupQueues[elements[i]].front());
groupQueues[elements[i]].pop();
}
}
mergeFlag = 0;
}
totalGroups = newLen;
if (totalGroups != 0) {
processGroups(); // 递归处理下一轮的队列
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; ++i) {
int currentElement;
cin >> currentElement;
if (currentElement == previousValue) {
groupSizes[totalGroups]++; // 相同元素,增加当前组大小
} else {
groupSizes[++totalGroups] = 1; // 新组
}
groupQueues[totalGroups].push(i); // 将元素索引加入队列
previousValue = currentElement;
}
for (int i = 1; i <= totalGroups; ++i) {
elements[i] = i; // 初始化元素组的索引
}
processGroups(); // 处理所有队列
return 0;
}