CF670C Cinema

知识点:离散化

这个题是李煜东离散化的例题,准确的说是一维序列的离散化,步骤一共三个,排序去重映射,或者叫查询,这里至少是两个数组,一个储存的是原来的数据,一个是储存的排序去重之后的数据,并且拿下标来映射原来的数据,

离散化的思想就是数据的范围比较大,比如整型范围内,而我们的数据只有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分钟过了这道做过的题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值