【题解】 [省选联考 2021 A/B 卷] 卡牌游戏

P7514 省选联考 2021 A/B 卷 卡牌游戏 - 洛谷 (luogu.com.cn)

极差 = 最大值 - 最小值,这意味着你在值域上 找一个区间。

区间越大越容易合法,区间越小越优。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 2e6 + 10;
LL a[N], b[N];
struct node {
	LL x;
	int ki;   // 0:a,1:b 
	int id;
} t[N];

bool cmp(node na, node nb) {
	if (na.x != nb.x) {
		return na.x < nb.x;
	}
	else {
		return na.ki < nb.ki;
	}
}

int v[N], ha[N], hb[N];

int main () {
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
		t[i] = {a[i], 0, i};
	}
	for (int i = 1; i <= n; i ++) {
		cin >> b[i];
		t[i + n] = {b[i], 1, i};
	}
	sort (t + 1, t + n * 2 + 1, cmp);
	memset(v, 0, sizeof(v));
	memset(ha, 0, sizeof(ha));
	memset(hb, 0, sizeof(hb));
	
	LL ans = 2e9;
	int sumv = 0, sumb = 0;
	// sumv 检查区间内是不是 n 个数都有
	// sumb 检查区间内最多有 m 个单个 b
	int r = 0;
	for (int l = 1; l <= 2 * n; l ++) {
		while (r < 2 * n && (sumv < n || sumb > m)) {
	// r 不能越界是硬性条件,而 sumv < n 和 sumb > m 是不合法区间的判断 
	// 也就是如果这两个条件有一个不符,整个区间就不合法 
			r ++;
			if (v[t[r].id] == 0) {
				sumv ++;
			}
			v[t[r].id] ++;
			if (t[r].ki == 0) {
				ha[t[r].id] = 1;
				if (hb[t[r].id] == 1) {
					sumb --;
				}
			}
			else {
				hb[t[r].id] = 1;
				if (ha[t[r].id] == 0) {
					sumb ++;
				}
			}
		}
		if (sumb <= m && sumv == n) {
			// 保证是合法并非越界终止循环 
			ans = min(t[r].x - t[l].x, ans);
		}
		
		v[t[l].id] --;
		if (v[t[l].id] == 0) {
			sumv --;
		}
		if (t[l].ki == 0) {
			ha[t[l].id] = 0;
			if (hb[t[l].id] == 1) {
				sumb ++;
			}
		}
		else {
			hb[t[l].id] = 0;
			if (ha[t[l].id] == 0) {
				sumb --;
			}
		}
	}
	
	cout << ans << "\n";
	
	return 0;
}
相关推荐
这个DBA有点耶2 小时前
COUNT慢不是因为用了*,是这5个原因——1000万行数据实测+执行计划深度解析
数据库·mysql·算法
贾伟康2 小时前
【口算王|01】HarmonyOS ArkTS 口算题生成实战:按年级、运算类型和难度生成可控题目
算法·harmonyos·arkts·随机生成·口算题
lzx_0022 小时前
C++11(一)
开发语言·c++·算法
529宝宝起名网2 小时前
用 Python 实现名字寓意评分算法:基于 NLP 语义分析的名字内涵深度评估
python·算法·自然语言处理
带多刺的玫瑰3 小时前
Leecode#26刷题之删除有序数组中的重复项
数据结构·算法·leetcode
小七在进步3 小时前
C++入门(2)
java·jvm·c++
en.en..4 小时前
C语言核心解析:#define与typedef本质区别
开发语言·c++·算法
码匠许师傅4 小时前
【设计模式精讲】26.策略模式(Strategy)
c++·设计模式·策略模式·uml
果果燕5 小时前
实习笔记(六)主机按钮状态上报完整流程
开发语言·c++·php