【离散化】 电影
传送门
题意
\(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中,排序后去重,用下标来代表对应语言,即将语言编号离散化为下标,
语言序列有序,每次二分查找即可,rec记录懂每种语言的专家的人数
\(O ( (n + m) · log (n+m))\)
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define pb push_back
const int N=2e5+10;
int a[N],b[N],c[N],rec[N*3];
int n,m;
vector <int> alls;
int get(int x){
return lower_bound(alls.begin(), alls.end(), x) - alls.begin();
}
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[get(a[i])] ++;
int ans = 1, mxfi = 0, mxse = 0;
rep(i, 0, m){
int tfi = rec[get(b[i])], tse = rec[get(c[i])];
if(tfi > mxfi || (tfi == mxfi && tse > mxse)){
ans = i;
mxfi = tfi;
mxse = tse;
}
}
printf("%d\n", ans + 1);
}