分析
m 部电影和 n 个人最多涉及 2*m + n 种语言,我们把所有的电影和人涉及的语言放进一个数组,排序并离散化, 用一个 1~2*m+n 之间的整数代替每种语言。此时我们就可以用数组直接统计会上述每种语言的人的数量,从而选择满足题目要求的电影。
(摘自算法竞赛)
代码
#include<bits/stdc++.h>
#define N 200009
#define in read()
using namespace std;
inline int read(){
char ch;int f=1,res=0;
while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
while(ch>='0'&&ch<='9'){
res=(res<<3)+(res<<1)+ch-'0';
ch=getchar();
}
return f==1?res:-res;
}
int a[N],b[N],c[N],aa[4*N];
struct node{
int top,sec;
}p[N];
int sum[4*N],cnt=0,n,m;
int main(){
n=in;for(int i=1;i<=n;++i) a[i]=aa[++cnt]=in;
m=in;for(int i=1;i<=m;++i) b[i]=aa[++cnt]=in;
for(int i=1;i<=m;++i) c[i]=aa[++cnt]=in;
sort(aa+1,aa+cnt+1);
int nn=n;
nn=unique(aa+1,aa+cnt+1)-aa-1;
for(int i=1;i<=n;++i){
int pos=lower_bound(aa+1,aa+nn+1,a[i])-aa;
++sum[pos];
}
int ans,maxn=-1,maxn2=-1;
for(int i=1;i<=m;++i){
int pos=lower_bound(aa+1,aa+nn+1,b[i])-aa;
int pp=lower_bound(aa+1,aa+nn+1,c[i])-aa;
if(sum[pos]>maxn){
maxn=sum[pos];maxn2=sum[pp];//更新
ans=i;
}
else if(sum[pos]==maxn){
if(sum[pp]>maxn2){
maxn2=sum[pp];
ans=i;
}
}
}
printf("%d",ans);
return 0;
}