毕业复健 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\) 选个三角形。后面一串是三角形底下的点。

然后直接这样是平方级别的。尝试研究第二个式子进行优化:

\[f(i) \leftarrow f(j - 1) + j\cdot A - i\cdot A + \sum\limits_{x_t\in[i, j], y_t\in[0, k-j)} c_t \]

这样拆开后,前面的两项只和 \(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'\)

\[S' = \{ \delta(x, c) | x\in S, c\in [l_i, r_i] \} \]

直到出现 \(\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 串个数。转移显然:

\[f(i,j,t) \leftarrow f(i-1,j, t) \]

\[f(i,j,t) \leftarrow f(i-1,j-1, t - |p_j - i|) \]

\(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)\),则:

\[f(i) = \min_{j=x}^{i-1} \{ f(j) + \text{lcm}(A[i,j]) \} \]

直接做还不够快。考虑一个数 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。

posted @ 2023-06-30 17:17  Ryths  阅读(92)  评论(0)    收藏  举报