https://www.acwing.com/problem/content/105/
离散化
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
const int N=200010;
vector<int> a,b,c;
int ans[N],k[N],p[N];
struct Node{
int b,c;
int i;
}mov[N];
int n,m;
int find(int x){
int l=0,r=a.size()-1;
while(l<r){
int mid=l+r>>1;
if(a[mid]<x)l=mid+1;
else r=mid;
}
if(a[r]!=x)return 0;
return l+1;
}
bool cmp(Node a,Node b){
if(a.b-b.b)return a.b>b.b;
return a.c>b.c;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int k;
scanf("%d",&k);
b.push_back(k);
a.push_back(k);
}
sort(a.begin(),a.end());
a.erase(unique(a.begin(),a.end()),a.end());
for(int i=0;i<b.size();i++){
ans[find(b[i])]++;
}
ans[0]=0;
scanf("%d",&m);
for(int i=1;i<=m;i++)scanf("%d",&k[i]);
for(int i=1;i<=m;i++)scanf("%d",&p[i]);
for(int i=1;i<=m;i++){
mov[i]={ans[find(k[i])],ans[find(p[i])],i};
}
sort(mov+1,mov+1+m,cmp);
printf("%d",mov[1].i);
return 0;
}
哈希表(开放寻址法)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=300003,mod=300003;
int h[N],sum[N];
int m;
struct Node{
int l,r;
int i;
}mov[N];
void add(int u){
int i=u%mod;
while(h[i])i++;
h[i]=u;
sum[i]=1;
}
bool cmp(struct Node a,struct Node b){
if(a.l-b.l)return a.l>b.l;
return a.r>b.r;
}
int find(int u){
int i=u%mod;
while(h[i]!=u&&h[i])i++;
if(h[i]==u)return i;
return -1;
}
int main(){
scanf("%d",&m);
for(int i=1;i<=m;i++){
int a;
scanf("%d",&a);
int f=find(a);
if(f==-1)add(a);
else sum[f]++;
}
scanf("%d",&m);
for(int i=1;i<=m;i++){
int a;
int l;
scanf("%d",&a);
int fa=find(a);
if(fa==-1)l=0;
else l=sum[fa];
mov[i]={l};
}
for(int i=1;i<=m;i++){
int b;
int r;
scanf("%d",&b);
int fb=find(b);
if(fb==-1)r=0;
else r=sum[fb];
mov[i].r=r;
mov[i].i=i;
}
sort(mov+1,mov+1+m,cmp);
printf("%d\n",mov[1].i);
return 0;
}
哈希表(拉链法)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200003;
int idx,h[N],ne[N],w[N],sum[N];
int m;
struct Node{
int l,r;
int i;
}mov[N];
void add(int u){
ne[idx]=h[u%N];
w[idx]=u;
sum[idx]=1;
h[u%N]=idx++;
}
bool cmp(struct Node a,struct Node b){
if(a.l-b.l)return a.l>b.l;
return a.r>b.r;
}
int find(int u){
for(int i=h[u%N];~i;i=ne[i]){
if(w[i]==u)return i;
}
return -1;
}
int main(){
for(int i=0;i<N;i++)h[i]=-1;
cin>>m;
for(int i=1;i<=m;i++){
int a;
scanf("%d",&a);
int f=find(a);
if(f==-1)add(a);
else sum[f]++;
}
cin>>m;
for(int i=1;i<=m;i++){
int a;
int l;
scanf("%d",&a);
int fa=find(a);
if(fa==-1)l=0;
else l=sum[fa];
mov[i]={l};
}
for(int i=1;i<=m;i++){
int b;
int r;
scanf("%d",&b);
int fb=find(b);
if(fb==-1)r=0;
else r=sum[fb];
mov[i].r=r;
mov[i].i=i;
}
sort(mov+1,mov+1+m,cmp);
printf("%d",mov[1].i);
return 0;
}