求助分析时间复杂度
查看原帖
求助分析时间复杂度
552578
又菜又爱玩楼主2023/10/4 09:41

rt,代码如下,我认为每个点只会被遍历到一边,应当是 O(n)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;
}

2023/10/4 09:41
加载中...