Loading

四月是我的谎言

还是该写一点联考题解了,为退役之后 ACM 复健做好充分准备!

2.2 Contest [2022.7.23 杭二]

深渊尖啸 / shriek (图论, 人类智慧)

https://www.luogu.com.cn/problem/P11613

\(n\) 个点,最小点覆盖恰好为 \(k\) 的有标号无向图数量。

\(n < 2^{14},0 \leq k < n\)

为什么看官方题解能直接看懂的,太厉害了。

现在要求 \(g(n,k)\),表示 \(n\) 个点中,最小点覆盖为 \(k\) 的图的数量 \(\bmod 2\)。考虑 \(\bmod 2\) 带来的优势,就是说我们可以找到一种对应方法,把不好处理的图配对,然后抵消掉。

这里的对应方法相当神秘:抵消掉 \(1\) 号点和 \(2\) 号点邻域不同的图。当然,这么说不太完全。

具体来说,记 \(V_i\) 表示 \(i\) 的邻域并上 \(i\)(为了方便起见)。如果 \(V_1 \neq V_2\),那么交换 \(1,2\) 的邻域后,最小点覆盖是不变的,同时图变化了。于是我们把 \(V_1 \neq V_2\) 的情形抵消掉了。

如果 \(V_1 = V_2\),考虑:

  • \((1,2)\) 存在边,则 \(1,2\) 必然选中至少一个点。因为 \(1,2\) 本质上是对称的,因此可以随意钦定一个点选中,此时,欲求 \(f(n,k)\),只需要求出 \(f(n-1,k-1)\)。因此,我们可以把 \(1\) 号点删除,后面的点重新标号为 \(1,2,\cdots,n-1\),然后继续考虑。
  • \((1,2)\) 不存在边,由于 \(V_1 = V_2\),则 \(1,2\) 在最小点覆盖的方案中要么同时被选中,要么同时不被选中。同时,它们的出边集合相同,因此可以考虑将 \((1,2)\) 合并成为一个权重为 \(2\) 的新点,并保留原来的出边。

对于 \(3,4\)\(5,6\) 依次按照上述方法进行考虑。如果某一次考虑的两个点的 \(V\) 集合不相同,就交换这两个点的邻域,制造一一对应,然后抵消掉这张图。我们只需要考虑合并出若干个权重为 \(2\) 的新点,最终剩下至多 \(1\) 个点的情形。

现在,对于这些权重为 \(2\) 的新点,也按照上述方法进行类似的考虑。于是,会合并出若干个权重为 \(4\) 的新点,最终剩下至多 \(1\) 个权重为 \(2\) 的点。

以此类推,我们最终只需要考虑,按照上述方法考虑之后,能够被表示为若干个权重依次为 \(2^{w_1},2^{w_2},\cdots,2^{w_l}\) 的点的图。

若一张图最后可以被上述方法表示,那么可以明确如下几点:

  • \(w_i\) 两两不同。理由:第 \(k+1\) 轮至多只剩下一个权重为 \(2^k\) 的点。

  • 该图的最小点覆盖至少为 \(c = n - \sum \limits_{i=1}^{l} 2^{w_i}\)。理由:现在留在图上的点,均为没有确定是否在最小点覆盖中的点,这是因为当 \((1,2)\) 存在边时,我们总是钦定 \(1\) 号点在最小点覆盖内,并删除 \(1\) 号点。

  • 对于 \(1 \leq i \leq l\),设原图上一个大小为 \(2^{w_i}\) 的点集 \(S_i\) 合成了这个权重为 \(2^{w_i}\) 的点,那么 \(S_i\) 内部无边。原因同上。

考察我们的过程,此时剩在图上的要么是 \(l\) 个孤立点,要么是以权重最小的点为中心的菊花,两者均有一种方案,其余方案都有偶数种(可以打表证明)。因此,我们只要求出了 \(f(n,\{w_i\})\),表示有多少个 \(n\) 个点的图,在经过上述方法之后,可以被集合 \(\{w_i\}\) 表示,就可以用它来转移到 \(g(n,c)\)\(g(n,c+2^{\min(w_i)})\)

只需 DP 求出 \(f\)。由于 \(\sum 2^{w_i}\) 不能超过 \(n\)\(w_i\) 两两不同,我们可以直接使用二进制数来表示一组 \(\{w_i\}\)

初始有 \(f(1,1) = 1\)。从 \(f(i,j)\)\(f(i+1,j')\) 转移时,注意到,我们会新加入一个大小为 \(1\) 的点,然后进行若干次合并,到中途某一步可能会删除,也可能一直不删除。

例如,当 \(j = (10111)_2\) 时,合法的 \(j'\) 有:

  • \((10111)_2\):加入之后立刻删除;
  • \((10110)_2\),加入之后合并一次,删除;
  • \((10100)_2\),加入之后合并两次,删除;
  • \((11000)_2\),加入之后合并三次。

黑暗降临 / descending (构造, 随机化)

给定 \(n\),构造 \(n \times n\) 的小写字母矩阵 \(c\),使得:所有 \(f_x(i,j) = c_x[i]c_x[i+1]\cdots c_x[j]\)\(g_x(i,j) = c_i[x]c_{i+1}[x]\cdots c_j[x]\),其中 \(i<j\),这 \((n-1)n^2\) 个字符串两两不同。

\(1 \leq n \leq 18\)

不难发现只需要前两个字符不同,只剩下 \(2n(n-1)\) 个字符串。同时,\(26^2 = 676 > 2 \times 17 \times 18 = 612\),于是出解概率不小,直接随机即可。

关于随机方法:直接 shuffle 然后设计估价函数,随机调整就行了,或者设计估价函数进行模拟退火即可,其余的手动调整似乎都不如模拟退火。

暗影之魂 / soul (结论, chkmin / chkmax)

给定长度为 \(n\) 的正整数序列 \(a\),有 \(q\) 次操作:

  • 对于 \([l,r]\) 查询:\(\gcd(a_l,\operatorname{lcm}(a_{l+1},\gcd(a_{l+2},\cdots,)))\)
  • 对于 \(x\)\(a_x\) 修改为 \(v\)

\(1 \leq n,q\leq 2 \times 10^5,1 \leq a_i \leq 10^9\)

恐数据结构症犯了。

因为 \(\gcd,\operatorname{lcm}\) 的本质其实是指数上做取 \(\min\) 和取 \(\max\),不妨考虑质因子唯一,此时是取 \(\min\)\(\max\) 的情形。

不难发现查询可以看作:\(a_r\) 依次经过函数 \(f_{r-1},f_{r-2},\cdots,f_l\)。一个很蠢的想法是直接维护分段函数,反正次数最多 \(29\)。但这样肯定就把可拓展性否定完了。但是玩几下就发现这个分段函数没有很杂乱啊?

事实上一个数 \(x\) 经过区间之后的结果可以简单地表示为:\(x\)\(A\)\(\max\) 再对 \(B\)\(\min\)

考察两个区间,左区间为 \(A_0,B_0\),右区间为 \(A_1,B_1\)。设 \(x\) 经过左区间变为 \(f(x)\),经过右区间变为 \(g(x)\),则我们可以猜测经过两个区间会变为 \(f(g(x)) = \min(f(B_1),\max(f(A_1,x)))\)。枚举 \(A_0,B_0,A_1,B_1,x\)\(5!\) 种大小关系即可证明,或者感性理解这里的「结合律」。

另外一种方法是直接拆 \(\max,\min\) 的式子。运用方法:

  • \(\max(a,\min(b,c)) = \max(\min(a,b),\min(a,c))\)
  • \(\max(a,\max(b,c)) = \max(a,b,c)\)

交换变量位置(对于 \(\min\) 同理)。可以得出类似的结论。

线段树维护即可。

2.3 Contest

七曜九执天竺笔算 / tenjiku (暴力)

鸽子无限好,只是进省队。

给定序列 \(a_1,a_2,\cdots,a_n (1 \leq a_i \leq n)\)

时刻 \(0\),有 \(n\) 个人分别在点 \(1,2,\cdots,n\)。 若一个人在点 \(i(1 \leq i \leq n)\),一单位时间后他就会到达点 \(a_i\)。 你可以在一个整数时刻,封锁一个点,在这一地点的每个人都将被逮捕,求一次性最多能逮捕多少人。

对于 \(k=0,1,\cdots,n\),求更改 \(a\) 中的至多 \(k\) 个元素为 \([1,n]\) 中的任意整数后,\(f(a)\) 的最大值。

\(1 \leq n \leq 10^5\)

分为两种情况:最终出现了至少一棵自环树,以及没有出现任何一棵自环树。

出现了至少一棵自环树的情况是好处理的。其余情况枚举最终环长,再枚举每一棵树计算答案后求和即可。

每一棵树的答案等价于从环上某一个点断开一条链然后接到最终的环上。那么我们也是可以枚举环上的点的,每一次不需要 \(O(l)\) 重新计算答案,而是考虑:一棵子树里的点的 dis 会增加环长,其余子树的点的 dis 全部减去 \(1\),然后维护众数的出现次数。这里是可以简单指针 + 桶维护的。

立方招兵支银给米题 / rice (计数)

省流:求 \(n\) 个点的无标号基环树内向森林数量,其中每个点的度数不超过 \(k\)

\(1 \leq n < 229,1 \leq k \leq 80\)

三个问题。

  • 一是求出 \(1,2,\cdots,n\) 个点的无标号内向树数量使得每个点的度数不超过 \(k / k-1\)。这个按照 CF724F 处理即可。
  • 二是求出 \(1,2,\cdots,n\) 个点的无标号基环树数量。枚举环长 \(l\) 和置换 \(g = 0,1,\cdots,l-1\),使用 Burnside 引理可以得到环上应该被划分为 \(l / \gcd(l,g)\) 个等价类,等价类内部必须选择相同的内向树。据此利用第一步计算出的东西 DP 即可。
  • 三是求出 \(1,2,\cdots,n\) 个点的无标号基环内向森林的数量。这个和一的处理方法是类似的。

鬼谷算题 / calc (DP, 随机化)

\(n\) 个长度分别为 \(t_1,t_2,\cdots,t_n\) 的区间。给定参数 \(L\)。现在要把区间任意摆放在数轴正半轴上,区间可以相交或包含,但对于任意 \([x,x+L]\) 不得有大于两个区间被 \([x,x+L]\) 完整包含。求最后一个区间的最小右端点。

\(n \leq 2 \times 10^4, L \leq 10^4\)

原题。稍加转化之后可以变为:给定集合 \(S\),值域为 \([1,L]\),将集合划分为两个部分 \(T_0,T_1\),使得和尽可能接近。

这是容易的。记 \(s = \text{sum}(S)/2\),在 \(S\) 中任意选择一些数,直到再选将会超过 \(s\)。不难发现此时选中的和离 \(s\) 至多差 \(L\)

\(S\) 中将这些数标记为选择,然后按照随机顺序对 S 进行 DP,决策有:不改变,将选择的反悔为不选择,将不选择的选上。由于只需要记录可行性,于是我们只记录那些和始终在 \([s-\sqrt n L,s + \sqrt n L]\) 的就可以了。

2.4 Contest

数星星 / stars (DP)

求有多少长度为 \(n\),值域在 \([1,3]\) 的序列,满足给定的 \(m\) 条限制。限制形如:区间 \([l,r]\) 的颜色数为 \(c\)

\(1 \leq n \leq 5000,1 \leq m \leq 10^6\)

不难发现只需要保留 \(O(n)\) 条限制。

那么设 \(f(i,j,k)\) 表示考虑到前 \(i\) 个数,其余两种颜色最后一次出现的位置分别是 \(i > j \geq k\)(因为可以为 \(0\))的方案数。

转移从 \(f(i,j,k)\)\(f(i+1,j,k),f(i+1,i,k),f(i+1,i,j)\) 转移。限制形如:清空若干行 / 若干列。

我们考察一下,发现只会修改一行的值。于是我们总共只会加入 \(O(n^2)\) 个有值的位置,清空自然也是 \(O(n^2)\) 的,于是就做完了。

看日出 / sunrise (暴力)

给定 \(n\) 和正整数序列 \(a_1,a_2,\cdots,a_n\)

对于 \(k = 0,1,\cdots,n(n+1)/2\) 求解如下问题:选恰好 \(k\) 个区间 \([u,v] \subseteq [1,n]\),然后,对于每个区间 \([l,r] \subseteq [1,n]\),你可以选择一个你选择的,被 \([l,r]\) 包含的区间 \([u',v']\)(如果存在),然后获得 \([u',v']\) 的权值和。该方案的权值被定义为过程中获得的所有权值和之和。问所有选择方案中的最大权值。

\(1 \leq n \leq 9\)

想到从区间和从大往小扫描就做完了。从左往右扫描是什么废物玩意啊?

我们只需要记录一个长度为 \(n\) 的数组,记录对于每个 \(l\),哪些 \(r\) 还没有选定权值。那么注意到选定 \([u,v]\) 会把 \(l \leq u\) 的,\(r \geq v\) 的区间全部选定(如果还没有选定的话),于是只需记录对于每个 \(l\)\(r\) 小于多少的部分还没有选定。这个东西显然就是卡特兰数级别的。

Codeforces 1924E Paper Cutting Again (概率期望)

好题。首先将 \(k\) 减去 \(1\),转化为:面积 \(\leq k\) 就停止。

考虑转化一下,变为保留右下角矩形。那么,每条线至多被选中一次。

注意到最后一次操作是不好计算的,因为可以在任意一个 $< k $ 的面积处停止。特判初始面积 \(\leq k\),转化为:每条线被选中后,仍然非法的期望次数之和。

对于横线 \(i = 1,2,\cdots,n-1\),不难发现 \(i\) 被选中要满足:

  • \(i\) 被切的时候小于 \(i\) 的横线没有被切(否则 \(i\) 已经在矩形外部);
  • \(i\) 被切的瞬间,矩形面积不能小于等于 \(k\)。也就是说,任何满足 \(ij \leq k\) 的横线 \(j\) 不能先于 \(i\) 被切掉。

竖线同理。

转化为每条线被选中的概率之和。我们知道对于排列 \(p\),某个元素 \(x\) 位于另外 \(k\) 个元素之后的概率恰为 \(\frac{1}{k+1}\),因此直接按照该式计算上述概率求和即可。

2.6

(名字忘了)

这题也不太是题,说实话。我们发现如下结论:

  • 一个点合法当且仅当它周围的边出现了至少一次这个点的点权;
  • 一条边合法当且仅当两个端点出现了至少一次这条边的边权。

然后随便玩一玩,转换为:

  • 一个环有 \(3 \times 2^c\) 种方案,在割边处合并的时候乘 \(2/3\)
  • 给点仙人掌定向使得每个点度数是奇数;

两个问题。应该都是不太难的。

(名字忘了 *2)

2.7

这场疑似上场,好困,想不动。

Codeforces 1392G

就是说我们想办法构造一个,自由度更低的东西,比如说前后缀啥的,然后靠着某些结构拼一拼。

发现交换操作的逆是它自身。一个想法是维护 \(s\) 进行 \(l,l+1,\cdots,n\)\(t\) 进行 \(n,n-1,\cdots,r+1\) 的结果,然后认为它们和原来的 \(s,t\) 答案相等。事实上是不对的,后者直接进行 \(r+1,r+2,\cdots,n\) 就好了。原因是如果反向操作,\(t\) 修改的位置应当是逆排列中的对应位置,这样倒过来两次就等于正向操作了。

接下来是感人的观察:枚举相同部分中 \(1\) 的个数。设相同的 \(1\) 数量是 \(r\),答案是 \(k-p-q+2r\)。这是人能想到的?

于是我们不需要对于每个 \(w\)\(\max\limits_{s \oplus t = w}(A_s+B_t)\) 而是直接枚举相同的 \(1\) 的集合,同时维护出最小的 \(p,q\),以及相同的时候最优的左端点和右端点。

看上去疑似是咖啡喝少了。

posted @ 2025-02-02 23:27  Meatherm  阅读(68)  评论(0)    收藏  举报