毕业复健 Diary
毕业了赶紧复健,不然校队都进不了,队友都带不动我。
鉴定为普及组水平。
稍微难点的题先不开了!
CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!)
D. Tenzing and His Animal Friends
首先不难想到要建个图。
对于一个选定的集合 \(S\),对于所有满足 \(i\in S, j\not \in S\) 的边 \((i, j)\),这次 game 的结果是将这些边的权值同时减同一个值。那么我们先使 \(S \leftarrow \{1, 2,\cdots, n-1\}\),然后慢慢缩小这个集合。
每次遍历整个边集,将所有跨在 \(S\) 内外的边找出,game 时间就是这些边权的最小值。
每次至少缩掉一个点。复杂度 \(O(nm) = O(n^3)\)。
Submission #211053493 - Codeforces
E. Tenzing and Triangle
一个显然的结论:所有选择的三角形必定两两不交。因为出现这种情况的话就还不如直接合并,cost 只少不多而且面积更大。
然后考虑 dp。定义 \(f(i)\) 为消除所有 \(x \in [i, k]\) 的点所需最小代价。那么 \(i\) 从 \(k\) 到 \(0\):
-
\(f(i) \leftarrow f(i-1) + \sum\limits_{x_j=i} c_j\)
表示 \(i\) 不用作任何三角形左边界。
-
\(f(i) \leftarrow f(j - 1) + (j - i)\cdot A + \sum\limits_{x_t\in[i, j], y_t\in[0, k-j)} c_t\)
表示 \(i\sim j\) 选个三角形。后面一串是三角形底下的点。
然后直接这样是平方级别的。尝试研究第二个式子进行优化:
这样拆开后,前面的两项只和 \(j\) 相关。然后对于后面一坨,注意到我们的 \(i\) 从 \(k\) 到 \(0\) 扫过来,其实 \(x_j\ge i\) 是没什么关系的,然后就也是只和 \(j\) 有关了。这些只和 \(j\) 有关的我们记一个 \(g(j)\),然后每次搞出 \(g\) 中的最小值即可。
每次过掉一个 \(i\),我们都加一个新的 \(j=i\),然后把所有 \(x_t=i\) 的点都做一次对相应 \(g(j)\) 的更新。可以发现这是个区间加。线段树优化即可。\(O(n\log n)\)。
Submission #211090105 - Codeforces
Codeforces Round 881 (Div. 3)
E. Tracking Segments
单调性显然,越后面越可能 beautiful。
二分答案。
Submission #210720806 - Codeforces
F. Omsk Metro
因为边权是正负 \(1\),所以对于一个路径,它的最大子段和以及最小子段和是 \(r, l\),那么 \([l, r]\) 中的所有整数都是存在至少一条子段与之对应。从构造的角度解释:每次我们接一个 \(\pm 1\), 新加入的是所有前/后缀,假如原前/后缀构成集合 \([l', r']\),那么新的就是 \([l'\pm 1, r'\pm 1]\),并入 \([l, r]\) 的话是不会断开的。
于是整个题就是树上链最大/小子段和问题。倍增/树剖等都可以。
Submission #210730221 - Codeforces
Codeforces Round 880 (Div. 2)
C. k-th equality
注意 \(C\) 要么 \(\max(A, B)\) 要么 \(\max(A, B)+1\),否则无解。
枚举所有的 \(a\),对于每个 \(a\),计算出 \(b\) 的取值区间(根据 \(c\) 的上下界算),从而知道可以用的 \(b\) 的个数。如果合不到 \(k\) 就跳。
一旦合到了 \(k\),枚举 \(b\) 即可。复杂度是 \(O(10^A+10^B)\)。
Submission #210193711 - Codeforces
E. Twin Clusters
值域 \([0, 4^k)\)。我们先看 \(2k\) 位的前 \(k\) 位:\(2^{2k}+1\)(含 0)个前缀中必定有重复,也就是说必定可以找 \(2^k+1\) 个前 \(k\) 位为 \(0\) 的区间。
算出这些区间的后 \(k\) 位 xor,必定又有一个重的。于是就找到了。
Submission #210656851 - Codeforces
Educational Codeforces Round 151 (Rated for Div. 2)
C. Strong Password
子序列自动机。
考虑在 \(m \le 10\) 上做文章。但一定不是 \(10^{10}\)。
记集合 \(S\) 位当前所有可能到达的点。对于每一位 \(i\),可选字符为 \([l_i, r_i]\),那就每一个都试一遍,得到一个新的 \(S'\):
直到出现 \(\delta(x, c) = \text{NULL}\) 的情况就可以了。复杂度 \(O(n\sum(r_i-l_i))\)。
Submission #211789022 - Codeforces
D. Rating System
过于感性,不写了。
Submission #211789172 - Codeforces
E. Boxes and Balls
考虑朴素的 dp:记 \(f(i,j,t)\) 为前 \(i\) 个中有 \(j\) 个一,用了最少 \(t\) 次操作,得到的本质不同 0/1 串个数。转移显然:
\(p_j\) 表示第 \(j\) 个 1 的位置。这样是 \(O(n^2k)\) 的,过不了。
然后我没有想到的是减少状态。
就是考虑对于一个前缀 \([1, i]\), 共原有 \(s_i\) 个 1,那新序列的 \(s_i' \in [s_i - O(\sqrt k), s_i + O(\sqrt k)]\)。
因为要将 \([1, i]\) 外的 \(x\) 个 1 移动到其中,至少需要 \(x^2\) 次操作, 而显然 \(x^2 > k\) 的话就没什么意义了。
于是第三维的枚举数 \(O(k) \to O(\sqrt k)\)。
复杂度 \(O(n^2\sqrt k)\),滚动数组优化一下空间。
Submission #211787954 - Codeforces
TROC #33
C. Digit War
答案只和 \(N \bmod 10\) 是否 =0 有关。
D. Compatible Product
题目要求取一个 \(Z\),满足 \(\forall k\in N^*, \prod(A_i+k) \equiv Z \pmod k\)。
也就是 \(\prod A_i \equiv Z \pmod k\)
也就是 \(Z = \prod A_i \bmod 998244353\)。
E. Satu
注意到这种倍数的一般状态不会很多。所以直接大力搜索,从每个卡牌开始都来一遍。
对于当前每个卡牌 \(x\),检查是否有一个 \(px(p> 1)\) 属于下一个人。没有就寄,加入答案。
每个卡牌 \(x\) 都对应不超过 \(NK/x\) 次状态,加上查找一共 \(O(NK\log^2(NK))\)。
F. Sayed and Billiards
考虑一个点,若存在一个正 \(K\) 边形使得该点落于其上,这个点就是合法的。
不过一个误区就是,只考虑狭义的正 \(K\) 边形。例如 \(K=5\) 时其实应该考虑五角星。
算出最近的一条边到中心的距离 \(d = \sin \frac \pi {2K}\)(圆半径为 1)。
则答案 \(=1 - d^2\)。
G. LXM
记 \(f(L, R) = \text{lcm} (A_L, A_{L+1}, \cdots , A_R)\)。
则 \(\forall a \le b \le c\le d\),有四边形不等式 \(f(a,d)\ge f(b,c)\)。
也就是说,要求 \(x\) 到 \(y\) 的最短距离 \(\text{dis}(x,y)\),只考虑 \(x \to v_1 \to v_2\to \cdots \to v_t \to y\),其中 \(v\) 按升序排列。
所以答案为 \(\sum \text{dis} (P_i, P_{i+1})\)。
对于 \(\text{dis}(x,y)\),动态规划。定义 \(f(i)\) 为 \(\text{dis}(x,i)\),则:
直接做还不够快。考虑一个数 lcm 上另一个数,要么不变,要么翻 2 倍或更多倍。
而答案 \(\le N\times \max^2 (A)\),这是连成 \(1,2,3,\cdots\) 的链的代价。所以 lcm 只允许有 \(O(\log [N\times \max(A)])\) 种取值,每种取值都是一段连续区间,而每段连续区间都以左端点为最优转移点。
ST 表配合二分查找确定左端点。最后复杂度为 \(O(n\log^2(nA)\log A)\)。
H. Her Lost
如果无修那就直接点分治。
然后现在带修了,考虑点分树。
因为树是动态的,比较不好搞,于是就离线造出整个树,然后用赋值或取消赋值模拟原本的增删操作。
每个分治中心,对每个距离存一个对应的个数。
这里可以不用 map,每个连通块开一个 size 长度的 vector 即可。
距离也可以在建立点分树时预处理,不用另写一个 LCA。
然后就是太久没写导致我忘记要容斥子连通块。
这样是 \(O(n\log n)\) 的,只要用 unordered_map 维护点与点的距离。
最后就是不建议这样写因为常数爆炸,我写就直接 TLE,还不如官方题解 \(\log^2\)。
喜欢我点分树职业技术学院吗


TheForces Round #19 (Briefest-Forces)
B. K Integers
枚举 \(\gcd\) 的值 \(g\),则 \(a_i\) 都是 \(t\times g\) 的形式。
则 \(g\) 是 \(n\) 的质因子。
若 \(n/g \ge k\) 即可。
Submission #211965454 - Codeforces
C. Count Triples
在 \(10^9\) 左右,约数个数 \(d(n)\) 在一千左右的量级。
于是枚举 \(n = xyz\) 的 \((x,y,z)\),可以做到 \(O(d^2(n))\) 级别。
Submission #211970680 - Codeforces
D. Tree Construction
最小:\(n-1\)。菊花图。
最大:考虑先用 \(k\) 个点组成链,然后剩下 \(n-k\) 全挂在一个端点上。score = \(k(n-k)\le n^2/4\)。
如果不在范围内就一定无解。
否则可以先搞个最大的,然后每次将底端点沿着链上移。每次 \(-1\),所以一定可以覆盖最大到最小所有值。
Submission #211972750 - Codeforces
E. Max Mobius Sum
其实是傻题。
考虑分别维护 \(1\sim n\) 和 \(n+1\sim 2n\) 的前后缀信息。所谓信息就是常规的子段和方法。
然后就枚举 \(k\),拼接起来很方便。最后就是 左+右 和 右+左 两个。
注意一开始 WA on 2 可能是因为忘记考虑整个 \(1\sim 2n\) 中除了 \(1\sim n\) 或 \(n+1\sim 2n\) 中某一个子段不选其他都选的情况。
这个问题直接不好搞,但可以正难则反,去算最小子段和。复杂度 \(O(n)\)。
Submission #211979646 - Codeforces
Codeforces Round 882 (Div. 2)
B. Hamon Odyssey
如果全部 AND 得到的 \(x \ne 0\),那显然答案为 1。因为如果分割,一定有 \(\ge x + x > x\),不优。
如果 \(x = 0\),那就扫一遍,每次达到 AND 为零就结束一个区间。贪心地尽早结束,可以保证得到尽量多的段。
然而我脑子挂了,用 dp overkill 了此题。
Submission #212400132 - Codeforces
C. Vampiric Powers, anyone?
考虑最后可以得到的值,都可以由原序列一段区间 XOR 得到。
比如对于 \([l, r]\) 可以先取 \([l, n]\) 再取 \([r+1,n+1]\)。
最后只要算出每个位置作为右端点可取的所有值即可。
复杂度 \(O(n \times a)\),其中 \(a\) 不超过 \(256\)。
Submission #212387732 - Codeforces
D. Professor Higashikata
先造一个下表集合 \(S = \{1, 2, \cdots , n\}\)。
每次来一个区间 \([l, r]\),就将 \(S\cap [l, r]\) 删掉,从左到右。
被删的顺序就是下标的排序。
然后按这个排序维护一个序列。
例如排序的序列长为 \(k\)(\(k=n\) 不一定成立,因为有可能 \(S\) 有遗留元素)。加上全局共 \(c\) 个 1,那这些 1 应当排到排序序列的前 \(c\) 位。
排序序列前 \(c\) 位中 \(0\) 的个数就是答案。注意 \(c > k\) 的情况再判断一下。
树状数组维护排序序列即可。复杂度 \(O(n\log n)\)。
Submission #212439183 - Codeforces
F. The Boss's Identity
找找规律(循环平移):
- \([1], [2], [3], \cdots , [n]\)
- \([1, 2], [2, 3], \cdots, [n-1, n]\)
- \(\cdots\)
- \([n-k+1, 2], [n-k+2, 3], \cdots , [n-k, n-1], [n-k+1, n]\)
- \(\cdots\)
- \([1, n]\)
第一层是所有的单个元素。
第 \(k\) 层共 \(n-1\) 个,每个的右端点从 2 开始到 \(n\),向前长度为 \(k\)。
可以发现如果数组为环形,那一直下去就遍历了环上的所有段。
考虑复制一遍原数组拆环。
然后每个右端点都有 \(O(\log a)\) 级别个数的区间 OR,而每个 OR 值我们选最短的。
ST 表区间 OR + 二分位置。复杂度 \(O(n\log a)\)。
懒得写了。
至 7.7 结文。
UPD 2023/7/17:结束啦。
| Contest 1 | Contest 2 | Contest 3 | Contest 4 | Contest 5 | Contest 6 | Contest 7 | Contest 8 | 平均分 | 最高分 | 最低分 |
|---|---|---|---|---|---|---|---|---|---|---|
| 34.15 | 0.00 | 151.02 | 61.71 | 0.00 | 105.05 | 134.26 | 138.67 | 91.45 | 151.02 | 0.00 |
综排 rank 12。
浙公网安备 33010602011771号