1. 题目来源
链接:103. 电影
2. 题目解析
很经典的一道练习离散化的模板题。在此还是使用静态数组来实现。
思路:
lang
存所有的语言,alls
存离散化后的语言编号,在此采用双指针来实现unique
操作。a[i]
中保存原始的稀疏编号,用find
转变成稠密编号,并用ans
数组记录每种语言出现的次数。
主要参考了:这篇题解,写的很棒。
时间复杂度:
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)
空间复杂度:
O
(
n
)
O(n)
O(n)
前缀和:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 200005, M = 3 * N;
int n, m, tot, k;
int a[N], b[N], c[N], lang[M], alls[M], ans[M];
int find(int x) {
return lower_bound(alls + 1, alls + 1 + k, x) - alls;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]), lang[++tot] = a[i];
scanf("%d", &m);
for (int i = 1; i <= m; i ++ ) scanf("%d", &b[i]), lang[++tot] = b[i];
for (int i = 1; i <= m; i ++ ) scanf("%d", &c[i]), lang[++tot] = c[i];
sort(lang + 1, lang + 1 + tot);
for (int i = 1; i <= tot; i ++ )
if (i == 1 || lang[i] != lang[i - 1])
alls[++k] = lang[i];
for (int i = 1; i <= n; i ++ ) ans[find(a[i])] ++ ;
int a0 = 0, a1 = 0, a2 = 0;
for (int i = 1; i <= m; i ++ ) {
int x = ans[find(b[i])], y = ans[find(c[i])];
if (x > a1 || (x == a1 && y > a2))
a0 = i, a1 = x, a2 = y;
}
printf("%d\n", a0);
return 0;
}