Codeforces DIV2 670C Cinema(离散化)
题意:
有n个科学家,每个科学家会一个语言。
有m个电影,每个电影有一个音频语言和一个字幕的语言
输出最多人能听懂的电影的索引,如果有多个电影有相同的人数能听懂,则输出在此条件下最多人能看懂的一个,如果还有多个电影符合,输出任意
思路:
可以直接用map写
这里用离散化。数据范围2e5个科学家,且每个人只会一种语言。但是数据大小为1e9,所以我们可以离散化到一个计数数组中,然后再根据题意对其排序,如果lower_bound返回的下标等于查找值,则代表当前语言没有人会,语言编号始终大于0,所以我们把不会的语言指向cnt[0],将其设定为-1,进行排序即可
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 2e5+10;
struct mov
{
int index;
int sp;
int sub;
}a[maxn];
int b[maxn], index[maxn],cnt[maxn];
int n,t;
int find(int x) {
int ind = lower_bound(index+1, index + t+1, x) - index;
if (index[ind] != x) {
return 0;
}
return ind;
}
int main(void) {
scanf("%d", &n);
for (int i = 1; i <=n; i++) {
scanf("%d", b + i);
index[i] = b[i];
}
sort(index+1, index + n+1);
t=unique(index+1, index + n+1)-index-1;//获取去重后的元素个数
sort(b+1, b + n+1);
for (int i = 1; i <= n; i++) {
cnt[find(b[i])]++;
}
int m;
scanf("%d", &m);
for (int i = 0; i < m; i++) {
scanf("%d", &a[i].sp);
a[i].index = i + 1;
}
for (int i = 0; i < m; i++) {
scanf("%d", &a[i].sub);
}
cnt[0] = -1;
sort(a, a + m, [](mov a, mov b)->bool {
if (cnt[find(a.sp)] == cnt[find(b.sp)]) {
return cnt[find(a.sub)] > cnt[find(b.sub)];
}
return cnt[find(a.sp)] > cnt[find(b.sp)];
});
printf("%d", a[0].index);
return 0;
}