电影

Author Avatar
Axell 1月 08, 2019
  • 在其它设备中阅读本文章

题目描述

有m部正在上映的电影,每部电影的语音和字幕都采用不同语言,用一个int范围内的整数表达语言。有n个人相约一起去看其中一部电影,每个人只会一种语言,如果一个人能听懂电影的语音,他会很高兴;如果能看懂字幕,他会比较高兴;如果语音和字幕都不懂,他会不开心。请你选择一部电影让这n个人一起看,使得很高兴的人最多。如果很高兴人数最多的电影有好几部,选择比较高兴的人最多。如果答案还不唯一,输出最小编号的答案。

输入

第一行输入n (1<=n<=200000),表示有n个人
接下来一行输入n个整数,表示每个人所会的语言ai, (1<=ai<=10^9)
接下来输入m (1<=m<=200000),表示电影数量
接下来一行输入m个整数,表示每部电影语音的语言bj(1<=bj<=10^9)
接下来一行输入m个整数,表示每部电影字幕的语言cj(1<=cj<=10^9,且bj和cj不同)

输出

输出编号最小的答案

样例输入

3
2 3 2
2
3 2
2 3

样例输出

2

样例输入2:

6 
6 3 1 1 3 7 
5 
1 2 3 4 5 
2 3 4 5 1 

样例输出2:

1 

思路

因为语言的取值很大,但数据不多,所以可以离散化后映射,用logn的时间进行查询

代码

#include <bits/stdc++.h>
using namespace std;

struct node{
    int a,b,id;
}mo[200005];

int a[200005],sum[600005],t[600005],cnt,b,n,m,ans1=-1,ans2,ansid;

void init(){
    sort(t+1,t+cnt+1);  //排序
    cnt=unique(t+1,t+cnt+1)-(t+1);  //去重
}

int find(int x){
    int tmp=lower_bound(t+1,t+cnt+1,x)-t;  //查找
    return tmp;
}

int main(){
    cin>>n;
    for (int i=1;i<=n;++i){
        scanf("%d",&a[i]);
        t[++cnt]=a[i];
    }
    cin>>m;
    for (int i=1;i<=m;++i){
        int tmp;
        scanf("%d",&tmp);
        mo[i].a=tmp;
        t[++cnt]=tmp;
    }
    for (int i=1;i<=m;++i){
        int tmp;
        scanf("%d",&tmp);
        mo[i].b=tmp;
        t[++cnt]=tmp;
    }
    init();
    for (int i=1;i<=n;++i){
        sum[find(a[i])]++;
    }
    for (int i=1;i<=m;++i){
        int tmp=sum[find(mo[i].a)];
        int tmp2=sum[find(mo[i].b)];
        if (tmp>ans1){
            ans1=tmp;
            ans2=tmp2;
            ansid=i;
        }else if(tmp==ans1 && tmp2>ans2){
            ans2=tmp2;
            ansid=i;
        }
    }
    cout<<ansid<<endl;
    return 0;
}

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

本文链接:https://hs-blog.axell.top/archives/54/