【题解】 [省选联考 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;
}
相关推荐
沫璃染墨2 小时前
从零入门计算机网络系列(六):TCP套接字编程实战——从listen监听到客户端与服务器通信
linux·服务器·c++·tcp/ip·计算机网络·tcp
Jsundoku2 小时前
第六章 机器学习 -- 支持向量机
算法·机器学习·支持向量机
?abc!2 小时前
(数组)448. 找到所有数组中消失的数字
算法
淡海水2 小时前
05-03-源码-Boehm GC分配与碎片管理
开发语言·算法·unity·c#·游戏引擎·gc
努力实干2 小时前
C++ 面向对象与工程架构
开发语言·c++·架构
代钦塔拉3 小时前
【C++/Qt 进阶】设计模式系列(6):桥接模式——把“两个独立变化的维度“拆开
c++·qt·设计模式
青少儿编程课堂3 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
Shadow(⊙o⊙)3 小时前
仿muduo实现高并发服务器——EPOLL设置与移除Poller.hpp管理Channel
运维·服务器·c++
闻缺陷则喜何志丹3 小时前
【C++特性及类库】多线程
开发语言·c++·多线程·语言特性·系统库
多弗朗皮卡丘3 小时前
C++ 哈希(下)
c++·算法·哈希算法