知识点:离散化
这个题是李煜东离散化的例题,准确的说是一维序列的离散化,步骤一共三个,排序去重映射,或者叫查询,这里至少是两个数组,一个储存的是原来的数据,一个是储存的排序去重之后的数据,并且拿下标来映射原来的数据,
离散化的思想就是数据的范围比较大,比如整型范围内,而我们的数据只有10的6次方诸如此类很小的范围,我们不关注数据的绝对大小只关注数据的相对大小的时候,就可以使用离散化了,这个题确实是离散化不错的练习题,一道绿题完完全全考察的离散化,没有别的算法,当然也有别的方法做,
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int a[N], b[N], c[N], d[N * 3], e[N * 3], f[N * 3];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) { cin >> a[i]; d[i] = a[i]; }
int m;
cin >> m;
for (int i = 0; i < m; i++) { cin >> b[i]; d[n + i] = b[i]; }
for (int i = 0; i < m; i++) { cin >> c[i]; d[n + m + i] = c[i]; }
sort(d, d + n + m * 2);
int cnt = 0;
for (int i = 0; i < n + m * 2; i++) {
if (!i || (i && d[i] != d[i - 1])) e[cnt++] = d[i];
}
for (int i = 0; i < n; i++) {
int t = lower_bound(e, e + cnt, a[i]) - e;
f[t]++;
}
int Max1 = -1, Max2 = -1, ans;
for (int i = 0; i < m; i++) {
int t1 = lower_bound(e, e + cnt, b[i]) - e;
int t2 = lower_bound(e, e + cnt, c[i]) - e;
if (f[t1] > Max1) {
Max1 = f[t1];
Max2 = f[t2];
ans = i;
} else if (f[t1] == Max1 && f[t2] > Max2) {
Max2 = f[t2];
ans = i;
}
}
cout << ans + 1;
return 0;
}
12分钟过了这道做过的题