【离散化】 电影

题意

传送门
\(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);
}   

你可能感兴趣的:(【离散化】 电影)