这个世界上有很多叫小明的人,他们在不同的国家,不同国家有不同的语言,每一种语言有一个语言编号。
我们给出所有语言的编号,需要注意的是:每个国家的人除了可以懂自己国家的语言,也能懂编号相邻国家的语言,例如:语言编号为:1,7,10,51,7,10,5,其中:
母语编号为 11,懂编号为 1,51,5 的语言
母语编号为 55,懂编号为 1,5,71,5,7 的语言
母语编号为 77,懂编号为 5,7,105,7,10 的语言
母语编号为 1010,懂编号为 7,107,10 的语言
这个相邻编号指的并不是输入顺序,而是按照数字大小。同时我们还会告知每一个小明的母语是什么,按照上面的例子,如果小明的母语是 77,那么小明懂的语言编号是:5,7,105,7,10。
有一天世界上的小明突然想要聚集在一起看电影,现在有 mm 部电影,每部电影的声音对应的语言编号是 a[i]a[i],字幕对应的语言编号是 b[i]b[i]。如果小明可以听懂电影声音的话他会非常满意,如果小明可以看懂字幕的话他会比较满意,否则它很不满意。
现在问看哪部电影会使得 nn 个小明满意最高,输出这部电影非常满意人数和较满意人数(如果两部电影使得 nn 个小明非常满意的人数相同时,选比较满意的最多的那部电影)。、
输入
第一行:包含3个正整数 l,m,n (1≤l,m,n≤200000)。l为语言的数量,m为小明的数量,n为电影的数量 第二行:包含 l 个正整数 li(1≤li≤10^9),对应所有语言的编号。 第三行:包含 m 个正整数 mi (1≤m≤10^9),对应m个小明所在国家的语言。 后面n行:每行2个正整数ai, bi (1≤ai,bi≤10^9),其中ai为第i部电影的音频语言索引,bi为第i部电影字幕语言的索引。 可以保证每个电影的音频语言和字幕语言是不同的,即ai≠bi。
输出
打印两个整数—表示满足条件的电影的非常满意人数以及较满意人数。
数据范围
对于10%的数据,1<= n <= 8 对于50%的数据,1 <= n<= 1024 对于100%的数据,1 <= n <= 200000 1 <= m <= 200000,1≤li≤10^9,1≤ai≤10^9,1≤m≤200000, 1≤bj≤10^9,1≤cj≤10^9。
输入样例
3 3 2
1 3 2
1 3 1
3 1
1 3
输出样例
2 1
样例解释
先对列表排序,会语言1的人会语言2,会语言3的人会语言2,那么电影1的非常满意人数为1,较满意人数为2,电影2非常满意数为2,较满意人数为1,所以选择电影2,最终的结果为2 1。
参考题解
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
map<int, int> mp;
int cnt[200005];
int l1, m1, n1;
int l[200005];
int main()
{
ios::sync_with_stdio(false);
cin >> l1 >> m1 >>n1;
for(int i = 1; i <= l1; i++)
{
cin >> l[i];
}
sort(l + 1, l + l1 + 1);
for(int i = 1; i <= l1; i++)
{
mp[l[i]] = i;
}
for(int i = 1; i <= m1; i++)
{
int x;
cin >> x;
cnt[mp[x]]++;
cnt[mp[x] - 1]++;
cnt[mp[x] + 1]++;
}
int max1 = -1, max2 = -1;
for(int i = 1; i <= n1; i++)
{
int a, b;
cin >> a >> b;
if(cnt[mp[a]] > max1)
{
max1 = cnt[mp[a]];
max2 = cnt[mp[b]];
}
else if(cnt[mp[a]] == max1)
{
if(cnt[mp[b]] > max2)
{
max1 = cnt[mp[a]];
max2 = cnt[mp[b]];
}
}
}
cout << max1 << " " << max2;
return 0;
}