题意
传送门
\(n\)个科学家每个科学家只懂得一门语言,所有语言用\(1\sim 10^{9}\)的数字进行标号,
\(m\)部电影,每部电影的语音和字幕采用不同的两种语言,
所有科学家看同一部电影,如果一个科学家能听懂语音很开心,看懂字幕比较开心,都不懂不开心
选择一部电影,很开心的人数最多,很开心的人数相同时比较开心的尽量多
数据范围
\(\begin{array}{l}1 \leq n, m \leq 200000 \\ 1 \leq a_{i}, b_{i}, c_{i} \leq 10^{9}\end{array}\)
题解
将所有语言都存入到一个vector中,排序后去重,用vector中的下标来代表对应语言,即将语言编号离散化为vector下标,
因为排序过,每次二分查找即可,ans记录每种语言的次数
\(O ( (n + m) · log (n+m))\)
Code
#include
using namespace std;
#define rep(i,a,n) for(int i=a;i vi;
int a[N],b[N],c[N],rec[N*3];
int n,m;
vi alls;
int find_idx(int x){
int l=0,r=alls.size()-1;
while(l>1;
if(alls[mid]>=x) r=mid;
else l=mid+1;
}
return l;
}
int main(){
scanf("%d",&n);
rep(i,0,n) scanf("%d",&a[i]),alls.pb(a[i]);
scanf("%d",&m);
rep(i,0,m) scanf("%d",&b[i]),alls.pb(b[i]);
rep(i,0,m) scanf("%d",&c[i]),alls.pb(c[i]);
sort(alls.begin(),alls.end());
unique(alls.begin(),alls.end());
rep(i,0,n) rec[find_idx(a[i])]++;
int ans=1,mxfi=0,mxse=0;
rep(i,0,m){
int tfi=rec[find_idx(b[i])],tse=rec[find_idx(c[i])];
if(tfi>mxfi || (tfi==mxfi && tse>mxse)){
ans=i;mxfi=tfi;mxse=tse;
}
}
printf("%d\n",ans+1);
}