【离散化】 电影

传送门

题意

\(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);
}   
posted @ 2020-07-12 01:10  Hyx'  阅读(143)  评论(0编辑  收藏  举报