题意 给你一个长为 \(n\) 的串,字符集为 \(a,b,c,d,e,f\) .你可以将整个串打乱之后重新放置,但是某些位置上有一些限制:必须放某个字符集的字符.问字典序最小的串,如果无解输出 "Impossible". \(n\le 10^5\) 分析 每次贪心地选择字典序最小的字符判断,判断后面是否可以完美匹配.可以考虑霍尔定理. 这里有两种想法,一种是对于每种字符开一个 \(bitset​\) 记录被包含的位置然后求并集(字符匹配位置):另一种则是考虑 "非完美算法&…
link 题意: 给你一个长为n的串,字符集'a'~'f'.你可以重排这个串,满足指定m个位置上只能放特定的字符,m个位置以及字符集会给出.求字典序最小的串? $n,m\leq 10^5.$ 题解: 稍微需要那么一点技巧的贪心. 贪心策略比较显然,无非就是从左往右放尽可能小的字符,同时保证当前位置之后有合法解. 考虑预处理a[i]:i位置可以放的字符集:cnt[i]:集合i的字符在整个串中出现的次数:b[i][j]:i~n位置中a[]被集合j包含的个数.每次判断一个字符是否可行,只要枚举任意一个…
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1009G.html 题目传送门 - CF1009G 题意 给定一个长度为 $n$ 的字符串 $s$ .并给定 $m$ 条限制,第 $i$ 条限制声明了第 $i$ 个位置的字符可以取的值.如果没有声明表示可以任意取值. 求一个字符串 $s$ 的排列,在满足 $m$ 条限制的同时,使得字典序最小.如果不存在满足限制条件的字符串,则输出 $-1$. $n,m\leq 10^5$,字符集 $ = \{'a','b…
Allowed Letters 最直观的想法是贪心取, 然后网络流取check可不可行, 然后T了. 想到最大流可以等于最小割, 那么我们状压枚举字符代表的6个点连向汇点是否断掉, 然后再枚举64个本质不同的位置, 是否需要切段原点联想它的边, 单次check复杂度64 * 64 用sosdp能优化到64 * 6 #include<bits/stdc++.h> #define LL long long #define LD long double #define ull unsigned lo…
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: 为什么加椅子?我们可以在最左边或最右边一直加直到人人都有座位. 首先这道题目抽象成二分图很简单,然后我们可以只要求解出人与座位的最大匹配是多少,总人数减去即可,但跑二分图最大匹配显然会超时,我们就可以往霍尔定理方面想. 然后你还需要知道一个霍尔定理推论:假设某个人的集合为\(X\),这个集合所对应的…
题面戳我 Solution 二分图是显然的,用二分图匹配显然在这个范围会炸的很惨,我们考虑用霍尔定理. 我们任意选取穿\(l,r\)的号码鞋子的人,那么这些人可以穿的鞋子的范围是\(l,r+d\),这个时候我们可以根据霍尔定理得出满足人人有鞋子穿的时候的式子是 令\(sum[i]\)表示穿\(i\)号鞋子的人数 \[\sum^r_{i=l} sum[i] \leq (r-l+1+d)*k\] 我们把这个式子整理下: \[\sum^r_{i=l} (sum[i]-k) \leq d*k\] 我们会…
bzoj3693 Solution: 显然我们可以把人和位置抽象成点,就成了一个二分图,然后就可以用霍尔定理判断是否能有解 一开始我随便YY了一个\(check\)的方法:就是每次向后一组,我们就把那一组可以位置标记为\(true\),用线段树存储,比如我们处理到了第\(i\)组,线段树里面就是前面\(i\)组可以放在那一些位置上,\(check\)总共可以放的位置数目不小于前\(i\)组总人数就继续,否则输出\(No\),这样显然是错的,很容易举出反例,于是我进行了一下的神奇操作. 我们先按照…
题意 一共 \(n\) 只球队,两两之间会进行一场比赛,赢得一分输不得分,给出每只球队最后的得分,问能否构造每场比赛的输赢情况使得得分成立.多组数据 \(T\le 10,n\le 5\times 10^4\) 分析 容易想到一个网络流的模型:把每场比赛看成点,连向对应的两只队伍.实际上可以把每只队伍的拆成 \(a_i\) 个点就是二分图的模型了. 考虑霍尔定理,队伍和队伍之间的区别只在于 \(a\) ,所以考虑枚举队伍数量 \(k\) ,判断最极端的 \(k\) 只队伍即可.\(a\) 最小的…
题意 洛谷 分析 参考了Icefox 首先二分,然后考虑霍尔定理判断是否有完美匹配.如果是序列的话,因为这里不会出现 \(j<i,L(i)<L(j)\) 或者 \(j<i,R(i)<R(j)\) 的情况,所以可以不用线段树,直接判断是否存在 \(j,i(j<i)\) 满足 \(R(i)-L(j)+1<i-j+1\) (只需要判断连续的一段). 因为是环,考虑将 \(a,b\) 数列分别倍长,但是发现环上到达某个 \(b\) 仍然需要讨论.此时只需要在最左边和最右边再加一…
题意 题目链接 分析 又是一个二分图匹配的问题,考虑霍尔定理. 根据套路我们知道只需要检查 "区间的并是一段连续的区间" 这些子集. 首先将环倍长.考虑枚举答案的区间并的右端点 \(r\),显然 \(r\) 应该在某个区间的右端点上.我们想要判断是否存在一个 \(l\) 使得 \(r-l+1\le m\) 且 \(\sum\limits_{l\le L_i,R_i\le r}a_i>r-l+1\) ,扫描线+线段树 即可. 有一类特殊情况:区间的并是整个环,这时它在序列上的表示长…