一.题目链接:

CodeForces-670C

二.题目大意:

有 n 个人,每人会且仅会一种语言.  (n ≤ 2e5)

语言有各自的编号(≤ 1e9)

这些人去看电影,一共有 m 种电影. (m ≤ 2e5)

每个电影的声音与字幕语言都不一样.

若有人的语言与声音语言一样,则称这个人很高兴♂.

若有人的语言与字幕语言一样,则称这个人比较高兴.

现让你选择一场电影,使得此电影中,很高兴的人最多,在此条件下,再使比较高兴的人最多.

三.分析:

因为要统计每种语言的人数,而语言编号 ≤ 1e9,存不下.

所以考虑离散化.

可得离散化之后,语言总数最多 n + 2m 种.

详见代码.

四.代码实现:

#include <set>
#include <map>
#include <ctime>
#include <queue>
#include <cmath>
#include <stack>
#include <bitset>
#include <vector>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define eps 1e-8
#define lc k * 2
#define rc k * 2 + 1
#define pi acos(-1.0)
#define ll long long int
using namespace std;

const int M = (int)2e5;
const ll mod = (ll)1e9 + 7;
const int inf = 0x3f3f3f3f;

int a[M + 5];
int b[M + 5];
int c[M + 5];
int lan[3 * M + 5];
int num[3 * M + 5];

int tofind(int x, int len)
{
    return lower_bound(lan + 1, lan + len + 1, x) - lan;
}

int discrete(int n, int m)
{
    int len = 0;
    for(int i = 1; i <= n; ++i)
        lan[++len] = a[i];
    for(int i = 1; i <= m; ++i)
    {
        lan[++len] = b[i];
        lan[++len] = c[i];
    }
    sort(lan + 1, lan + len + 1);
    return unique(lan + 1, lan + len + 1) - (lan + 1);
}

int main()
{
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    int m;
    scanf("%d", &m);
    for(int i = 1; i <= m; ++i)
        scanf("%d", &b[i]);
    for(int i = 1; i <= m; ++i)
        scanf("%d", &c[i]);
    int len = discrete(n, m);
    for(int i = 1; i <= n; ++i)
        num[tofind(a[i], len)]++;
    int ans = 1;
    int num1Max = 0;
    int num2Max = 0;
    for(int i = 1; i <= m; ++i)
    {
        int num1 = num[tofind(b[i], len)];
        int num2 = num[tofind(c[i], len)];
        if(num1 > num1Max || num1 == num1Max && num2 > num2Max)
        {
            ans = i;
            num1Max = num1;
            num2Max = num2;
        }
    }
    printf("%d\n", ans);
    return 0;
}