CF1139E Maximize Mex 题解【二分图】】的更多相关文章

我发现我有道叫[SCOI2010]连续攻击游戏的题白写了.. Description There are \(n\) students and \(m\) clubs in a college. The clubs are numbered from \(1\) to \(m\). Each student has a potential \(p_i\) and is a member of the club with index \(c_i\). Initially, each student…
好题.不过之前做过的[SCOI2010]连续攻击游戏跟这题一个套路,我怎么没想到…… 题目链接:CF原网 洛谷 题目大意:在一个学校有 $n$ 个学生和 $m$ 个社团,每个学生有一个非负整数能力值 $p_i$,一开始在社团 $c_i$.接下来有 $d$ 天,第 $i$ 天编号为 $k_i$ 的同学会离开他的社团.每天同学离开后会有一场比赛,要从每个社团里选一个人出来组队(如果社团没人了就不管).队伍的能力是所有队员能力值集合的 $mex$(没出现过的最小非负整数).问这个 $mex$ 最大是多…
题目地址:CF1139E Maximize Mex 这其实是一个二分图匹配匈牙利算法的巧妙运用 考虑倒序回答 则由原来的删除改为添加 把 potential 值作为左部,则一共有编号为 \(0~m\) 共 \(m+1\) 个左部点 把 club 作为右部点 对每一个当前存在的对应关系添加一条对应的无向边 每次回答相当于从小到大对每一个左部点进行匹配,直到无法匹配,此时无法匹配的即为当前答案 之后每添加一条边在上次匹配后的图上继续匹配即可 #include <bits/stdc++.h> usi…
Maximize Mex 离线之后把删数变成加数, 然后一边跑匈牙利一遍算答案. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PLL pair<LL, LL> #define PLI pair<LL, int> #define PII pair<int, int> #define SZ(…
interlinkage: https://codeforces.com/contest/1139/problem/E description: 有$n$个学生,$m$个社团,每个学生有一个能力值,属于一个社团,在接下来的$d$天里,每天会有一个人退出所在的社团. 每天从每个社团中选出最多一个人组成能力值集合${p_i}$使得其$mex$最大.求出每天的最大$mex$值 solution: $mex$经常与二分图模型相关; 若答案为$t$,每一个小于$t$的能力值都对应一个提供它的社团.由此构造…
题目传送门 题意:给出n个人,m个社团,每个人都有一个标号,一个能力值,并且属于一个社团,第i天的凌晨,第$k_i$个人会离开.每天每个社团最多派一个人出来参加活动.派出的人的能力值集合为S,求每天$MEX{S}$的最大值. 思路:这道题正着删人和倒着加人是一样的,并且很容易看出是二分图的题,加边显然要比删边容易操作,所以我们要倒着考虑. 只要想到了倒着考虑,剩下的就比较好想了.由于从小到大的能力值是必选的,我们把能力值作为左边的节点,社团作为右边的节点.每增加一个人就增加对应的边,每次匹配的时…
题目链接: http://codeforces.com/contest/1139/problem/E 题意: 开始有$n$个同学和$m$,每个同学有一个天赋$p_{i}$和一个俱乐部$c_{i}$,然后在$d$天里,每天早上去除一名同学$k_{i}$,每天中午在每个俱乐部选一个人组成战队.战队的战斗力是最小的不存在的天赋,例如{1,2,3,0}战斗力是4,问每天战队的战斗力最大为多少. 数据范围: $1 \leq m \leq n \leq 5000$ $0 \leq p_i < 5000$ $…
前者:https://www.lydsy.com/JudgeOnline/problem.php?id=3339 后者: https://www.lydsy.com/JudgeOnline/problem.php?id=3585 https://www.luogu.org/problemnew/show/P4137 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 题解大部分都是莫队分块,但是复杂度为O(n*sqrt(n))=5e2*2e5=1e…
题目链接 虽然可以用离线算法水过去,但如果强制在线不就gg了. 所以要用在线算法. 首先,所有大于n的数其实可以忽略,因为mex的值不可能大于n 我们来设想一下,假设已经求出了从0到n中所有数在原序列中小于r时最后出现的位置,用k[i]来表示 那么显然mex(l,r)就是小于l的最小的k[j]中最小的下标,显然可以维护一下最小值,用二分来求. 然后建一颗主席数,root[i]表示此时考虑到了i,每次询问l,r时访问root[r]然后求一下就行了 复杂度时O(nlogn); # include<i…
题面 首先,由于本人太菜,不会莫队,所以先采用主席树的做法: 离散化是必须环节,否则动态开点线段数都救不了你: 我们对于每个元素i,插入到1~(i-1)的主席树中,第i颗线段树(权值线段树)对于一个区间[l,r]维护的便是原序列1~i中的所有属于[l,r]的元素出现的最后位置的最小值: 当我们查询[x,y]时,我们查询第y颗线段树,找到第一个位置使得(出现的最后位置的最小值)比(x)要小: 然后恢复离散化之前的数值,然后输出: #include <bits/stdc++.h> #define…