究极大模拟,有大佬帮忙看看我这个做法为啥不会超时吗
查看原帖
究极大模拟,有大佬帮忙看看我这个做法为啥不会超时吗
1215295
discretely楼主2024/7/16 17:14

处理第一部分对撞的时候,复杂度不是n方吗(,为啥不会超时(遍历套了一个erase),代码处有注释

#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<unordered_map>
#include<cmath>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<queue>
#include<deque>
#include<set>
using namespace std;
int _;
#define endl '\n'
#define p 1e9+7
//#define int long long

void solve(){
	map<int,int> mp;
	int n,m;cin>>n>>m;//0-12
    vector<int> a(n+1);
	for(int i=1;i<=n;++i) cin>>a[i];
	vector<int> r_odd;
	vector<int> l_odd;
	vector<int> r_even;
	vector<int> l_even;

	for(int i=1;i<=n;++i){
		char s;cin>>s;
		if(s=='L'&&a[i]%2) l_odd.push_back(a[i]);
		if(s=='L'&&!(a[i]%2)) l_even.push_back(a[i]);
		if(s=='R'&&a[i]%2) r_odd.push_back(a[i]);
		if(s=='R'&&!(a[i]%2)) r_even.push_back(a[i]);
		mp[a[i]]=i;
	}
	vector<int> ans(n+1,-1);//实时记录答案
	sort(l_odd.begin(),l_odd.end());
	sort(r_odd.begin(),r_odd.end());
	sort(l_even.begin(),l_even.end());
	sort(r_even.begin(),r_even.end());
	// for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
	// cout<<endl;

	//对撞   这里erase可能会超时
	for(int i=r_odd.size()-1;i>=0;--i){
		auto it=upper_bound(l_odd.begin(),l_odd.end(),r_odd[i]);
		if(it!=l_odd.end()){
			ans[mp[*it]]=ans[mp[r_odd[i]]]=abs(*it-r_odd[i])/2;
			l_odd.erase(it);
			r_odd.erase(r_odd.begin()+i);
			//cout<<1<<endl;
		}
	}
	for(int i=r_even.size()-1;i>=0;--i){
		auto it=upper_bound(l_even.begin(),l_even.end(),r_even[i]);
		if(it!=l_even.end()){
			ans[mp[*it]]=ans[mp[r_even[i]]]=abs(*it-r_even[i])/2;
			l_even.erase(it);
			r_even.erase(r_even.begin()+i);
		}
	}
	// for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
	// cout<<endl;
	//顺向
	for(int i=r_even.size()-1;i>=0;i-=2){
		if(r_even.size()<2) break;
		ans[mp[r_even[i]]]=ans[mp[r_even[i-1]]]=m-r_even[i]+(r_even[i]-r_even[i-1])/2;
		r_even.pop_back();
		r_even.pop_back();
	}
	for(int i=r_odd.size()-1;i>=0;i-=2){
		if(r_odd.size()<2) break;
		ans[mp[r_odd[i]]]=ans[mp[r_odd[i-1]]]=m-r_odd[i]+(r_odd[i]-r_odd[i-1])/2;
		r_odd.pop_back();
		r_odd.pop_back();
	}
	//for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
	//cout<<endl;
	for(int i=0;i<l_even.size();i+=2){
		if(l_even.size()-i<=1) break;
		ans[mp[l_even[i]]]=ans[mp[l_even[i+1]]]=l_even[i]+(l_even[i+1]-l_even[i])/2;
	}
	//for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
	//cout<<endl;
	for(int i=0;i<l_odd.size();i+=2){
		if(l_odd.size()-i<=1) break;
		ans[mp[l_odd[i]]]=ans[mp[l_odd[i+1]]]=l_odd[i]+(l_odd[i+1]-l_odd[i])/2;
	}
	//cout<<l_odd.size()<<endl;
	for(int i=l_odd.size()-1;i>=0;i--){
		if(ans[mp[l_odd[i]]]!=-1) l_odd.erase(l_odd.begin()+i);
		//cout<<l_odd[i]<<endl;
		//cout<<mp[l_odd[i]]<<endl;
		//cout<<ans[mp[l_odd[i]]]<<endl;
	}
	//cout<<l_odd.size()<<endl;
	for(int i=l_even.size()-1;i>=0;i--){
		if(ans[mp[l_even[i]]]!=-1) l_even.erase(l_even.begin()+i);
	}
    //for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
	//cout<<endl;
	//反向中的反向
	//cout<<l_odd.size()<<endl;
	for(int i=0;i<l_odd.size();++i){
		//cout<<1<<endl;
		if(!r_odd.size()) break;
		int len=(2*m-abs(r_odd.back()-l_odd[i]))/2;
		ans[mp[r_odd.back()]]=ans[mp[l_odd[i]]]=len;
		r_odd.pop_back();
	}
	for(int i=0;i<l_even.size();++i){
		if(!r_even.size()) break;
		int len=(2*m-abs(r_even.back()-l_even[i]))/2;
		ans[mp[r_even.back()]]=ans[mp[l_even[i]]]=len;
		r_even.pop_back();
	}
	 for(int i=1;i<=n;++i) cout<<ans[i]<<' ';
	 cout<<endl;
}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>_;
	while(_--){
		solve();
	}
	return 0;
}
2024/7/16 17:14
加载中...