RT,本人赛上脑子一热写了理论上 O(n2) 的 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;
}