rt,代码如下,我认为每个点只会被遍历到一边,应当是 O(n) 的时间复杂度,但是 TLE 80。
#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
const int N=2e5+5;
int n,num;
int a[N],qrt[N];
list<int> t;
list<int> ::iterator it,it2;
vector<int> ans;
vector<list<int> ::iterator> de;
deque<int> q[N];
int main(){
// freopen("fruit3.in","r",stdin);
// freopen("fruit3.out","w",stdout);
ios::sync_with_stdio(0),cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
a[0]=2;
for(int i=1;i<=n;i++){
if(a[i]!=a[i-1]){
qrt[++num]=a[i];
q[num].push_back(i);
t.push_back(num);
}
else{
q[num].push_back(i);
}
}
int pos=0;
while(1){
int pre=2;
it=t.begin();
for(it=t.begin();it!=t.end();){
int i=*it;
if(qrt[i]!=pre){
ans.push_back(q[i][0]);
q[i].pop_front();
pre=qrt[i];
if(!q[i].size()){
it=t.erase(it);
}
}
else{
it++;
}
if(it==t.end()) break;
}
if(ans.size()==pos) return 0;
for(int j=pos;j<ans.size();j++) cout<<ans[j]<<" ";
cout<<"\n";
pos=ans.size();
}
return 0;
}