zoukankan      html  css  js  c++  java
  • 【离散化】 电影

    传送门

    题意

    (n)个科学家每个科学家只懂得一门语言,所有语言用(1sim 10^{9})的数字进行标号,
    (m)部电影,每部电影的语音和字幕采用不同的两种语言,
    所有科学家看同一部电影,如果一个科学家能听懂语音很开心,看懂字幕比较开心,都不懂不开心
    选择一部电影,很开心的人数最多,很开心的人数相同时比较开心的尽量多

    数据范围

    (egin{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
    ", ans + 1);
    }   
    
  • 相关阅读:
    剑指offer——包含min函数的栈
    剑指offer——顺时针打印矩阵
    剑指offer——二叉树的镜像
    剑指offer——树的子结构
    爬虫的单线程+多任务异步协程:asyncio 3.6
    爬虫中的模拟登陆,IP代理,线程池
    爬虫-数据解析
    爬虫基础
    Markdown语法
    Git
  • 原文地址:https://www.cnblogs.com/hhyx/p/13286426.html
Copyright © 2011-2022 走看看