#include <bits/stdc++.h>
using namespace std;
const int M=1E5+50;
struct stu{
int id;
int flag=0;//用flag来帮忙排序
int cnt1=0;
int cnt0=0;
};
stu st[M];
int n;
bool cmp(stu&i,stu&j){
return i.flag>j.flag;
}
int cnt;
int zero[M];//前缀和
int one[M];//后缀和
int now1;
int ans;
int maxn;
int main(){
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
int id,flag;
cin>>id>>flag;
st[id].flag=1;
st[id].id=id;
if(flag){
st[id].cnt1++;
}
else {
st[id].cnt0++;
}
}
sort(st+1,st+1+n,cmp);
for(int i=1;i<=n;i++){
one[i]=cnt-now1;
zero[i]=zero[i-1]+st[i-1].cnt0;
if(one[i]+zero[i]>=maxn) {
maxn = one[i] + zero[i];
ans = st[i].id;
}
now1+=st[i].cnt1;
}
cout<<ans;
return 0;
}
还有个需要离散化的步骤,但是没时间了,想吃饭了。
就写到到这里吧
upd
实验课重新写了一个
#include <bits/stdc++.h>
using namespace std;
const int M=1e5+50;
struct stu{
int id;
int flag=1;
};
stu st[M];
int zero[M];//前缀
int one[M];//后缀
bool cmp(stu&i,stu&j){
if(i.id!=j.id){
return i.id<j.id;
}
return i.flag>j.flag;
}
int n;
int cnt1;//1总数
int now0;
int now1;
int maxn;
int ans;
int main(){
cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>st[i].id>>st[i].flag;
if(st[i].flag){
cnt1++;
}
}
sort(st+1,st+1+n,cmp);
for(int i=1;i<=n;i++){
zero[i]=now0;
one[i]=cnt1-now1;
if(zero[i]+one[i]>=maxn){
maxn=zero[i]+one[i];
ans=st[i].id;
}
if(st[i].flag){
now1++;
}
else{
now0++;
}
}
cout<<ans;
return 0;
}
这个最主要的思路就是排序的时候要把1排在前面,0排在后面,这样算的时候才会正确,反之的话就会出现算 0 出现错误
其实最常见的思路还是用离散化那种23333,由此也可以看出掌握常见的套路有多重要233333