你谷少爷机
查看原帖
你谷少爷机
1022907
lql1楼主2024/11/2 20:55

RT,本人赛上脑子一热写了理论上 O(n2)\mathcal O(n^2)vector 二分+暴力模拟删除,本地不开 O2 在官方给的大样例中用了 7.908s ,在 Luogu 上提交民间数据最慢的点只跑了 845ms

Code:

#include<bits/stdc++.h>
#include<bits/extc++.h>

using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;

#define ll long long
#define elif else if
#define sf scanf
#define pf printf
vector<int> w,r; 
int n;
void print(string preString,vector<int> v){
	cout<<preString<<" ";
	for(int x:v) cout<<x<<" ";
	cout<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
//    freopen("duel4.in","r",stdin);
	cin>>n;
	r.resize(n);
	for(int i=0;i<n;i++) cin>>r[i];
	sort(begin(r),end(r));
	w=r;
	//w:可以打r的
	//r:可以被w打的 
	for(int i=0;i<n;i++){
		if(w.empty()||r.empty()) break;
		//让r[i]去w里面找第一个可以打r的 
		auto it=upper_bound(begin(w),end(w),r[0]);
		//让it把r[i]打败
//		cout<<"find="<<*it<<endl;
		if(it==w.end()) continue;
		w.erase(it); 
		if(w.empty()||r.empty()) break;
		it=find(r.begin(),r.end(),r[0]);
		if(it!=r.end()) r.erase(it);
		if(w.empty()||r.empty()) break;
		it=find(w.begin(),w.end(),r[0]);
		if(it!=w.end()) w.erase(it);
		if(w.empty()||r.empty()) break;
		
		if(w.empty()||r.empty()) break;
//		print("w:",w);
//		print("r:",r);
	}
	cout<<r.size();
    return 0;
}

AC link

2024/11/2 20:55
加载中...