首页 > 其他分享 >【二分图】CF1139E Maximize Mex 题解

【二分图】CF1139E Maximize Mex 题解

时间:2023-10-07 13:11:08浏览次数:40  
标签:cnt CF1139E int 题解 复杂度 枚举 text Maximize ti

CF1139E

翻译中有一句话:校长将会从每个社团中选出一个人。

就是一些人被分为一组,从每组中选一些人出来。

这就很容易想到通过二分图的匹配。

\(\text{mex}\) 运算有一个显而易见的贪心:枚举每个值能否被匹配,第一个找不到的值就是答案。

由于 \(\text{mex}\) 运算的值域与 \(n\) 同级,就可以从这方面入手。

我们从每个能力值 \(p_i\) 向社团 \(c_i\) 建边。

假如枚举的值为 \(i\),与增广路算法相似,如果 \(i\) 能再找到匹配,那么 \(\text{mex}\) 的值一定会大于 \(i\),否则就找到了 \(\text{mex}\) 运算的答案。

但如果是这样的话,外层需要枚举到 \(d\),内层要枚举到最大值 \(V\),再加上匈牙利算法的单次的时间复杂度 \({\mathcal{O}}(m)\),就会使总时间复杂度高达 \(\mathcal{O}(dmV)\),当然会 TLE。

考虑优化。

突然感觉与这道题很像,都是枚举值域,然后匹配。

于是就想到了一个玄学优化:用时间戳来优化常数。

在 CF 上交了一次,应该是数据太水,还过了。

代码:

const int N = 5e3, inf = 1e9 + 7;
int n, m, now, D, T;
int c[N + 5], p[N + 5], d[N + 5];
int mat[N + 5], vis[N + 5];
int cnt, head[N + 5];
struct Edge {
	int v, ti, nxt;
} e[N + 5];
void add(int u, int v, int ti) {
	e[++cnt].nxt = head[u];
	e[cnt].v = v;
	e[cnt].ti = ti;
	head[u] = cnt;
}
bool dfs(int x) {
	for (int i = head[x]; i; i = e[i].nxt)
		if (e[i].ti > T && vis[e[i].v] != now) {
			vis[e[i].v] = now;
			if (mat[e[i].v] == -1 || dfs(mat[e[i].v])) { mat[e[i].v] = x; return 1; }
		}
	return 0;
}
int main() {
	n = read(), m = read();
	int W = 0;
	for (int i = 1; i <= n; i++) p[i] = read(), W = max(W, p[i]);
	for (int i = 1; i <= n; i++) c[i] = read();
	D = read();
	for (int i = 0; i <= n; i++) d[i] = inf; // 初始化到 n。
	for (int i = 1; i <= D; i++) d[read()] = i;
	for (int i = 1; i <= n; i++) add(p[i], c[i], d[i]);
	for (int i = 1; i <= D; i++) {
		T = i;
		for (int j = 0; j <= m; j++) vis[j] = mat[j] = -1; // mat[j] 的值可能为 0 (p[i] == 0)
		bool flag = 0;
		for (int j = 0; j <= W; j++) {
			now = j;
			if (!dfs(j)) {
				printf("%d\n", j);
				flag = 1;
				break;
			}
		}
		if (!flag) printf("%d\n", W + 1);
	}
	return 0;
}

这样卡一下应该还是不能过,时间复杂度还是没有变。

发现答案肯定是单调不增的,于是倒序枚举,就用一个 \(ans\) 数组记录一下答案,输出即可。

时间复杂度 \({\mathcal{O}}(md)\)

核心代码:

for (int i = D; i; i--) {
		T = i;
		for (int j = 0; j <= m; j++) vis[j] = 0;
		while (dfs(tot)) { // 答案是具有单调性的。
			tot++;
			for (int j = 0; j <= m; j++) vis[j] = 0;
		}
		ans[i] = tot;
	}

标签:cnt,CF1139E,int,题解,复杂度,枚举,text,Maximize,ti
From: https://www.cnblogs.com/Pengzt/p/17746035.html

相关文章

  • 网络规划设计师真题解析--TCP慢启动拥塞避免机制
    TCP使用慢启动拥塞避免机制进行拥塞控制。当拥塞窗口大小为16时,发送节点出现超时未收到确认现象时,将采取的措施是(26)。再经过5轮后的拥塞窗口大小为(27)。26、A.将慢启动阈值设为16,将拥塞窗口设为8,并进入拥塞避免阶段B.将慢启动阈值设为16,将拥塞窗口设为1,并进入慢开始阶段C.将慢启动......
  • 网络规划设计师真题解析--TCP慢启动拥塞避免机制
    TCP使用慢启动拥塞避免机制进行拥塞控制。当拥塞窗口大小为16时,发送节点出现超时未收到确认现象时,将采取的措施是(26)。再经过5轮后的拥塞窗口大小为(27)。26、A.将慢启动阈值设为16,将拥塞窗口设为8,并进入拥塞避免阶段B.将慢启动阈值设为16,将拥塞窗口设为1,并进入慢开始阶段C.将慢启动阈......
  • [题解] CF1245D - Shichikuji and Power Grid
    CF1245D-ShichikujiandPowerGrid题目传送门题意在一个网格图中,有\(n\)个城市。目标是使得\(n\)个城市都通电。对于一个城市有电,要么选择在其位置建立发电站,要么和另一个有电的城市连线。对于城市\(i\),在其位置建立发电站的费用为\(c_i\),和另一个城市\(j\)连电......
  • 【题解】洛谷#P7073 [CSP-J2020] 表达式
    【题解】洛谷#P7073[CSP-J2020]表达式Description给定一个逻辑表达式和其中每一个操作数的初始取值后,再取反某一个操作数的值时,求出原表达式的值。表达式将采用后缀表达式的方式输入。Solution根据题目可得,当取反一个操作数的值时,整个表达式大体只有变与不变两种情况,而往下......
  • CF1010C Border 题解
    题目传送门前置知识最大公约数|裴蜀定理简化题意给定一个长度为\(n\)的序列\(a\),求能用\(r=(\sum\limits_{i=1}^{n}d_ia_i)\bmodk\)表示的不同的\(r\)的个数及所有情况,其中对于每一个\(i(1\lei\len)\)均有\(d_i\)为非负整数。解法依据裴蜀定理,不难得到存......
  • CF131D Subway 题解
    题目传送门前置知识强连通分量|最短路解法考虑用Tarjan进行缩点,然后跑最短路。缩点:本题的缩点有些特殊,基于有向图缩点修改而得,因为是无向图,所以在Tarjan过程中要额外记录一下从何处转移过来,防止在同一处一直循环。基环树上找环还有其他方法,这里仅讲解使用Tarjan求......
  • 题解: P6933
    题目传送门这道题我用的是二分答案,只不过这道题和一般的二分答案有些不同,是浮点数的二分答案。那自然和整数的二分答案有些不同,下面我会说到。我们先来看一下思路解法。思路解法首先确定了是二分答案,我们需要先确定初始的\(l\)和\(r\)和check函数。check函数好写,我们......
  • 【UVA 514】Rails 题解(栈+队列)
    PopPush市有一个著名的火车站。那个里的乡村是令人难以置信的丘陵。车站建于上世纪。不幸的是,当时资金极其有限。有可能仅建立表面轨迹。此外,事实证明,该站可能只是一个死胡同(见图片),由于缺乏可用空间,它只能有一个轨道。当地的传统是,每一列从A方向到达的火车都会继续朝A方向行驶......
  • 【题解 P4550】 收集邮票
    收集邮票题目描述有\(n\)种不同的邮票,皮皮想收集所有种类的邮票。唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是\(n\)种邮票中的哪一种是等概率的,概率均为\(1/n\)。但是由于凡凡也很喜欢邮票,所以皮皮购买第\(k\)次邮票需要支付\(k\)元钱。现......
  • neovim的插件管理器vim-plug导致代码颜色不显示问题解决
    neovim的帮助文件路径F:\Programs\Neovim\share\nvim\runtime\docruntimepath的帮助文档路径F:\Programs\Neovim\share\nvim\runtime\doc\options.txt$VIM环境变量$VIM被用来确定Vim中不同的用户文件的位置,比如用户启动脚本“.vimrc”。这个是系统设置,详见startup。允许每......