【题解】 [省选联考 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;
}
相关推荐
武子康1 小时前
Qwen-Drive 到底是什么:4B 级 VLM 如何成为驾驶策略底座
人工智能·算法·机器学习
坤坤子吖2 小时前
Linux网络编程:TCP服务器的多进程与多线程实现
linux·服务器·开发语言·网络·c++·笔记·学习
一晌小贪欢3 小时前
Python基础:第 09 篇 · while 循环:重复直到不满足
开发语言·c++·python·数据可视化·面向对象·python办公
zh_xuan3 小时前
LeeCode 496. 下一个更大元素I
数据结构·算法·栈·单调栈
机 _ 长3 小时前
05 智算运维|8 张卡怎么才算「捆成一张」:NCCL 实测与拓扑
运维·人工智能·算法·智算运维
xiaoye-duck3 小时前
《C++ 项目:手写大模型接入 SDK》LLMManager架构设计与实现
开发语言·网络·c++·语言模型
一条大祥脚4 小时前
CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进
开发语言·c++·python·cutlass·cute·cute dsl
·present·4 小时前
CSAPP(lecture 13_02 Linking)
c语言·c++
早起CaiCai4 小时前
【2023-01 OM】利用深度学习算法融合异质观测实现海洋场降尺度
人工智能·深度学习·算法
梦里寻码4 小时前
我用 NestJS + Vue3 写了一套完整的研发管理系统(58 表 / 229 API / 130 项断言,全开源
前端·后端·算法