2024 7月集训前记录
2024 7月集训前记录
P5538 【XR-3】Namid[A]me
给定 \(n\) 个点的点带权树,设其度数为 \(1\) 的点个数为 \(d\),点 \(i\) 的权值为 \(a_i\),令 \(f(u,v)\) 为 \(u\to v\) 路径上点权与,对所有无序对 \((u,v)\) 求和 \(f(u,v)^{f(u,v)}\)
引理:一条链上固定起点 \(u\),不同的 \(f(u,v)\) 仅有 \(O(w)\) 种。
假设存在链 \(u,\cdots,v_1,v_2\),且 \(f(u,v_2)\not=f(u,v_1)\),\(f(u,v_2)\) 一定是 \(f(u,v_1)\) 二进制某几位的 \(1\) 变成 \(0\)。一共有 \(w\) 位,一共有 \(O(w)\) 种。
引理:一个有 \(d\) 个叶子的子树,对于树中所有点 \(u\),\(f(rt,u)\) 仅有 \(\mathbf O(dw)\) 种。
每一个从根到叶子的路径上有 \(O(w)\) 种,\(d\) 个路径的并有 \(O(dw)\) 种。对每个点的子树都维护一下每种值的出现次数,复杂度 \(O(ndw)\)
对于跨越子树的根的贡献,每两个叶子只会在它们的最近公共祖先处合并,复杂度 \(O(d^2w^2)\) 的。而这个贡献还有另外一个上界 \(O(n^2)\),最多有 \(n^2\) 条路径。复杂度为 \(O(ndw)\),直接求每种值的出现次数即这个复杂度。之后需要卡一下空间。
P4704 太极剑
破环为链思想,但这个不太一样的是在于,它要破成三个对应的区间解决。
一条线被切断,切线的这刀所在的直线与圆的交点 \(P_i\) 在这一条线(不是指刀)的两侧。被切断的线对应的区间一定里面有一个 \(P_i\) ,外面有一个 \(P_j\)
现在我们需要解决的,就是最小化 \(P_i\) 的数量,让连续的 \(n\) 个区间每个区间里面都有一个 \(P_i\) ,外面都有一个 \(P_i\)
最短的区间内部枚举第一个 \(P\),记录第一个 \(P\) 的位置。若区间端点 \(j\) 对应的区间的左端点大于第一个 \(P\) 的位置,则说明这个位置不在这个端点对应的区间里,在这个区间里再开一个 \(P\) 。为了尽可能让这个断点也在之后的区间里,所以把这个 \(P\) 开在 \(j\)。实现的时候用一个变量维护这个位置,然后枚举区间长度,复杂度 \(O(n)\)
P4708 画画
观察数据范围,非常的小,打表即可解决。
考虑正解
设 \(f_{i,j}\) 表示第 \(i\) 个点,从 \(1\) 到 \(i\) 有 \(j\) 个点度数为奇数的方案数。枚举当前点连接了多少奇偶性为奇的点多少奇偶性为偶的点,分类讨论自己是奇是偶。\(f_{n,0}\) 大小为 \(n\) 的完全图的答案。
考虑边权造成的影响。对于重边,选出奇数条和偶数条的方案相等。那么解决方案为,忽略这个边权,等 \(dp\) 结束后再统一乘上方案数。
刚刚求得的方案数乘上置换数,得到一种拆分的不动点个数。求和除以 \(N\) 的阶乘即为答案。
P7293 [USACO21JAN] Sum of Distances P
瞪了一上午好不容易有感觉然后假了,学 Retf 的题解没看懂,太神了,去看的第一篇题解。
从新图的起点走到 \(a_1,a_2...a_k\),就等价于在 \(k\) 张图上同时从 \(1\) 走到 \(a_i\)。保证每张图上从 \(1\) 走到 \(a_i\) 距离的奇偶性相同即可。
记 \(d1_i\) 为奇数最短路,\(d2_i\) 为偶数最短路。新图的起点到 \(a_1,a_2...a_k\) 的距离等于 \(\min\{\max\{d1_{a_i}\},\max\{d2_{a_i}\}\}\)。由 \(a+b=\min(a,b)+\max(a,b)\),同由 \(\max(d1_{a_i})+\max(d2_{a_i})-\max(\max(d1_{a_i},d2_{a_i}))\)。
记 \(w_i=d1_i,d2_i,\max(d1_i,d2_i)\)。考虑对于点 \(j\),求 \(j\in a_i\) 且 \(w_j=\max(w_{a_i})\) 的方案数。对于重复的 \(w_j\),按所属图的编号为第二关键字比较。将所有点按 \(w_j\) 为第一关键字,图的编号为第二关键字排序。按顺序依次加入每个点,加入属于图 \(k\) 的点 \(j\) 时的方案数,就是除 \(k\) 以外所有图已经被加入的点的个数的乘积。
CF1909G
考虑枚举确定 \(S\) 中 \(x+y\) 和 \(z\) 的分界线从而确定一长串 \(y^{k-1}\) 所在的区间。每次找到被钦定为 \(y^{k-1}\) 所在的区间的最小周期,枚举这个区间的每个周期作为 \(y\),判方案合法,想要使方案合法,必须 \(y^{k-1}\) 串前后必须包括在两个字符串的 \(\text{lcp}\) 和 \(\text{lcs}\) 内,且\(x+y\) 部分必须要包括一个 \(y\)。
考虑如何处理方案合法问题,观察发现性质,移边界把 \(y^{k-1}\) 作了循环移位,而循环移位不会改变周期。所有满足第一个条件的 \(y^{k-1}\) 区间周期都相同,而这些区间的左端点取值范围是 \([m-\text{lcs}-(m-n)+1,\text{lcp}+1]\)。对于第二个条件,把区间左端点取值范围改成 \([m-\text{lcs}-(m-n)+1+|y|,\text{lcp}+1]\)
代码很好实现。
P2664 树上游戏
正解点分治,不会写,考虑树形 \(dp\)。节点 \(i\) 到根 \(root\) 的路径上没有颜色为 \(c[i]\) 的节点 \(i\) 对答案 \(f[root]\) 的贡献为 \(size[i]\)。如果路径上有就没有贡献。所以 \(f[root]\) 直接求就行。
考虑 \(f[fa]\) 转移到其子节点 \(f[x]\)。\(c[fa]\) 和 \(c[x]\) 改变,\(fa\) 变成 \(x\) 的儿子,使 \(c[fa]\) 贡献减少了 \(size[x]\),\(x\) 变成根节点,\(c[x]\) 的贡献会变为 \(n\)。原本在 \(x\) 的子树中颜色为 \(c[fa]\) 的节点可能会产生新的贡献,也要计入 \(f[x]\)。原本不在 \(x\) 的子树中的颜色为 \(c[x]\) 的节点本来有贡献而现在就没有贡献了,不能计算至 \(f[x]\) 中。数组 \(b\) 记录 \(x\) 的子树中颜色为 \(c[fa]\) 的节点在以 \(x\) 为根节点时的贡献。跑第一遍 \(dfs\) 每次把 \(a[c[fa]]\) 存储并清空,在子树中遇到颜色为 \(c[fa]\) 的节点时正常添加贡献,回溯时得到的 \(a[c[fa]]\) 就是 \(b[x]\) 。将 \(a[c[fa]]\) 还原覆盖子树中的贡献。第二遍 \(dfs\),用数组 \(a\) 维护根节点为当前点时每种颜色的贡献。访问某个节点而还未修改 \(a[c[x]]\) 时 \(a[c[x]]\) 是以 \(fa\) 为根时 \(c[x]\) 的贡献,以 \(x\) 为根节点时 \(a[c[x]]\) 一定为 \(n\),二者之差即为 \(c[x]\) 新增的贡献。从而有:
P3473 [POI2008] UCI
基于最朴素的线性 \(dp\) 类传纸条的想法,用三个维度记录左上角和右下角和方向两维记录格子的位置。第二和三维状压掉。枚举 \(k\) 可以预处理掉,复杂度 \(O(n^3)\)。可过。
P3724 [AHOI2017/HNOI2017] 大佬
怼大佬与死是相互独立的,转化成两个子问题,一个是怼大佬,另外一个是让自己的自信值大于 \(0\)。\(dp\) 求出刷水题的最少次数。那么,现在要解决的就是 \(N\) 天能否怼死大佬。\(bfs\) 然后哈希去重求出所有的可行的天数和嘲讽值的集合按照嘲讽值从大到小排序。其余情况直接特判,对于怼两次大佬设两次怼大佬花费的天数分别是 \(d1,d2\),总共可以怼 \(day\) 天。嘲讽值是 \(f1,f2\),有
\(f\) 为第一关键字,\(d\) 为第二关键字排序。两个指针,分别从大往小和从小往大枚举保证 \(f_i+f_j≤C\),固定 \(i\) ,即为求 \(f_2-d_2\) 的最大值。由于是单调的,扫的时候扫一次就能解决。
CF494E Sharti
位置 \((x,y)\) 的 \({SG}\) 值为 \(\min\{{lowbit}(x),{lowbit}(y) ,{greatbit}(k)\}\)。\(SG\) 的值一定是 \(2^k\),计算 \([l,r]\) 的 \(lowbit\) 的异或和,\(i\) 作 \(lowbit\) 贡献次数为 \(\large\frac{r}{i}-\frac{l-1}{i}-\frac{r}{2i}+\frac{l-1}{2i}\) ,即为所有情况减去 \(i\) 不为 \({lowbit}\) 的情况。扫描线分别统计行和列的答案再合并。算出 \(\geqslant2^t\) 的个数等于 \(2^t\) 的个数作差可求。
P6892 [ICPC2014 WF] Baggage
手玩样例有最小步数是 \(n\)。
将结论最小形式化有:
..BA|BABA BABA|BABA
ABBA|BABA BABA|B..A
ABBA|..BA BABA|BBAA
ABBA|AAAA BB..|BBAA
A..A|AAAA BBBB|BBAA
AAAA|AAAA BBBB|BB..
\(4\) 步处理 \(4\) 个对子剩下 \(0,1,2,3\) 个对子,\(3\) 之后的 \(4,5,6,7\) 都是正常的解法,而且对 \(4\) 的余数也是 \(0,1,2,3\),于是我们尝试将最后的解决放到 \(4,5,6,7\) 中来。将最后的解决放到 \(4,5,6,7\) 中,这在剩下的对子数等于 \(4,5,6,7\) 时输出它们的解法。
P9499 「RiOI-2」change
贪心,考虑如何贪心。感觉肯定是要排序的,对谁排序是个值得思考的问题。但是仔细发现没有必要,将物品的价值加到答案,按物品编号从小到大走,在每个位置考虑把一些物品的贡献取消,合成到这个物品后后再加上贡献。代码实现很简单,但是复杂度很高,\(O(n^2)\) ,不太行。
如果合成该物品的价值之和大于 \(10^{10}\) 直接就不要了,可以加速我们的贪心,但是还是过不了。
用单调栈存一下 \(i\) 个物品所需要的代价,单调栈是 \(O(n)\)。但又合成,所以复杂度还要加个 \(\log\)
CF1610G AmShZ Wins a Bet
设 \(f_i\) 为 \(S[i,n]\) 后缀的最大字典序字符串,\([i,ne_i]\) 为极小匹配括号子串
\(g_i\) 表示 \(f_i\) 的开头所在位置,树性结构维护,其中 \(\mathrm{fa}(i)=g_{i+1}\),\(f_i\) 等于树上 \(g_i-> root\) 的链拼接成的字符串。比较 \(g_i -> root,g_{net_i+1} -> root\) 两条链的字典序,倍增维护哈希求 \(lcp\)。
CF1601F Two Sorts
meet in the middle 不错的一个折半搜索
\(i\) 看做排名,\(a_i\) 看成排名为 \(i\) 的数的值,考虑字典序排名相近的数的值。\(12\) 位的整数拆成两半,左边相同的数字典序连续。右边的一半为 \(0\) 到 \(999999\) 可以直接预处理并不会 T 掉。左边一半按照字典序枚举所有可能的前缀然后二分计算答案即可。