AtCoder 随机玩

Jewel Pairs

感觉这个题非常牛。

需要先将宝石按照价值是否大于 \(\lfloor \frac{L}{2} \rfloor\) 分类,分为“大点”和“小点”。

容易发现“大点”和“大点”一定无法匹配,对于“小点”和“小点”只需考虑颜色的限制,对于“大点”和“小点”两个限制都要考虑。

首先容易有一个贪心的想法:尽可能让价值大的点匹配,这个贪心显然是对的,因此先考虑“大点”和“小点”之间的限制。

考虑将大点的 \(b_i\) 变成 \(L-b_i\),然后把大点和小点混在一起按 \(b\) 排序,我们从前往后考虑每个大点恰好对应了按权值从大往小考虑每个大点,同时现在一个大点能匹配所有在它前面的小点。

根据贪心的想法,我们每考虑到一个大点都要尽可能使这个大点匹配,直接跑二分图匹配显然保单了,但是我们发现这个大点能匹配等价于把它加进来之后二分图最大匹配数加一。

因此可以直接考虑维护二分图最大匹配数,使用霍尔定理,把大点当成左部点,也就是要求出 \(\max(|S|-|N(S)|)\),其中可以把 \(|N(S)|\) 写成 \(sr-|F(S)|\)\(sr\) 表示右部点个数,\(F(S)\) 表示与点集 \(S\) 没有连边的右部点集合,也就是要最大化 \(\max(|S|+|F(S)|)\)

考虑若想要使这个值增大,\(S\) 必须包含当前考虑到的点 \(x\),分析一下,发现 \(S\) 必然会包含所有与 \(x\) 颜色相同的点,同时 \(|F(S)|\) 只与 \(S\)\(b\) 最大的颜色与 \(x\) 不同的点有关,设这个点是 \(u\),那么此时 \(|F(S)|\) 的值为\(b_i>b_u\)\(co_i=co_x\) 的点数”,此时 \(S\) 则为 \(u\) 之前的所有点加上 \(u\) 之后颜色与 \(x\) 相同的点。

所以可以在从左往右扫描的过程中简单维护每种颜色的 \(\max(|S|+|F(S)|)\)

接下来就要考虑小点和小点之间的匹配了,我们可以得知有 \(x\) 个小点在前面的匹配中没被用到。

我们设 \(f_i\) 表示做完小点和大点之间的匹配后,颜色为 \(i\) 的小点最少剩几个,设 \(y=\max f_i\),我们断言:

  • \(y \le \lfloor \frac{x}{2} \rfloor\),则恰好有 \(x \bmod 2\) 个小点无法匹配。
  • \(y > \lfloor \frac{x}{2} \rfloor\),则恰好有 \(y-(x-y)=2y-x\) 个小点无法匹配。

对于第二种情况,容易发现至少有 \(y-x\) 个点无法匹配,则对于 \(y\) 对应的颜色至少有 \(2y-x\) 个点被丢弃,丢弃后可以转化为第一种情况。

对于第一种情况,我们可以求出任意一组“大小”匹配,如果存在一种颜色点数 \(> \lfloor \frac{x}{2} \rfloor\) 的颜色,那么可以直接调整,直至 \(\le \lfloor \frac{x}{2} \rfloor\)

最后的问题是如何舍弃权值最小的小点,可以仿照大小匹配的方法,把小点变成左部点去匹配大点,如果加入这个小点二分图最大匹配数不变就可以舍弃。


[ABC238Ex] Removing People

考虑数方案数。

直接按照题目的过程设计 DP 显然是做不了的,因此考虑转化:我们按照删除的顺序从后往前加人,考虑当前人左边和右边的人,当前人可以让他左边的人变成 \(\verb!R!\),代价是他和他左边的人的距离,也可以让他右边的人变成 \(\verb!L!\),代价是他和他右边的人的距离,最终要满足方向序列与题目给出的 \(S\) 相同。

然后就能区间 DP 了,设 \(f_{i,j}\) 表示把 \(i,j\) 都放好的前提下放好 \([i+1,j-1]\) 区间内的人的代价之和,\(g_{i,j}\) 表示方案数。

直接枚举区间内第一个放的人然后随便计算一下贡献就好了,需要注意对环的处理。


[AGC023D] Go Home

首先车最后到的一定是 \(1\)\(N\)

然后需要注意到\(X_1 \ge X_N\),则车会先去 \(1\),证明:

  • \(N=2\) 时成立。
  • \(N \ge 3\)\(X_{N-1} < S\),那么显然也成立。
  • \(N \ge 3\)\(X_{N-1} > S\),那么如果车在到达 \(N-1\) 时到过 \(1\) 了结论成立,否则可以转化成上面的情况。

然后就简单了,因为这样实际上 \(1\)\(N\) 是同一种策略,如果 \(X_1 \ge X_N\),那么把 \(N\) 删掉,让 \(P_1\) 变成 \(P_1+P_N\),把答案加上 \(X_N-X_1\);否则把 \(1\) 删掉,让 \(P_N\) 变成 \(P_1+P_N\),答案也加上 \(X_N-X_1\)

一直递归直到 \(S<X_1\)\(S>X_N\) 就行了,此时答案容易计算。


[AGC032C] Three Circuits

题意等价于将边分成三个集合,每个集合都能找出欧拉回路。

原图必须能找出一条欧拉回路,否则无解,也就是度数必须都是偶数。

随后,我们发现如果存在一个点度数 \(\ge 6\),一定可以在构造欧拉回路的过程中找出包含这个点的三个环,然后把剩下的边拼到这三个环上即可,显然是一定可行的。

接下来只需考虑只存在度数为 \(2\)\(4\) 的点的情况即可。

如果不存在度数为 \(4\) 的点或只存在一个显然无解。

如果度数为 \(4\) 的点有 \(2\) 个,这两个点中间要么是四条链,要么是两条链并且两个点上各挂着一个环,不难发现只有第二种情况合法。

如果度数为 \(4\) 的点有 \(\ge 3\) 个,我们任意取出三个点 \(A,B,C\),如果这三个点之间的某两个点满足“两个点之间是两条链并且两个点上各挂着一个环“就合法了,否则三个点之间一定分别是四条链,不难发现此时也有解。


Moving Pieces on Line

在差分数组上考虑,相当于所有 \(c_{t_i}\) 都要是 \(1\)

而显然棋子不会走回头路,因此一个起点为 \(u_i\),终点为 \(v_i\) 的棋子等价于把 \(c_{u_i}\)\(c_{v_i}\) 都取反。

因此当 \(n<t\) 显然无解。

对于 \(n=t\) 的情况可以直接贪心。

对于 \(n>t\) 的情况我们需要引入一个新操作:合并两个棋子。

不难发现只有两个棋子相邻才能合并。

这样直接 DP 就做完了。

posted @ 2025-03-07 08:58  Tx_Lcy  阅读(27)  评论(0)    收藏  举报