小题狂练 (B)

先放这吧,不一定啥时候能做完呢 .

[Ynoi Easy Round 2023] TEST_69

势能线段树,每个点只有 log 次有效修改,维护区间 lcm 即可知道需不需要向下递归修改 .

可以把 lcm 与 1000000000000000003 取 min 会少一些细节 .

[WC2020] 猜数游戏

好像思路确实比较自然,先找原根,连 \(a\to a^k\) 的边肯定是形成一个 DAG(在某些位置需要钦定一个顺序),DAG 上只需要找入度为 0 的点的个数 .

没有离散对数的地方单独做就行了 .

CF1110G Tree-Tac-Toe

分类讨论,经过一些分析后的核心问题是一条链的问题,左右可能是叶子或三度点,这里只有叶子可以是白色 .

那么只有白色叶子或三度点的情况非平凡,这里需要用奇偶性分析,具体考察每次染色的时候选择奇偶性有利的一边 .

需要特判 \(n=4\) .

详细说明可以看 APJifengc 的做题纪要 .

CF1804G Flow Control

感知一下发现肯定 log 轮除以二就进循环节了,考虑若干个这样的结构叠加起来如何维护 .

如果只有一个的话肯定就是前 \(\log v\) 步暴力后面循环 . 否则考虑维护的时候用并查集动态缩相等的数,定义一个数的势能为当前集合内第一个比它小的数与它的差,那么减数时势能总和不变,而每次除以二之后势能减半,那么可以得到时间复杂度为 \(O(n\log v)\) . 某些写法可能会多 log .

APJ 是势能分析强者 .

[BJ United Round #3] 押韵

直接刻画后单位根反演可以得到答案的表达:

\[\left[\dfrac{x^n}{n!}\right]\left(\frac 1d\sum_{k=0}^{d-1}e^{\omega_d^kx}\right)^k \]

把单位根改成 \(\varphi(d)\) 个本原单位根的线性组合,那么就是有若干个 \(\varphi(d)\) 维向量,想算走 \(k\) 步到每个终点有多少种走法 . 也就是相当于要算一个简单 \(\varphi(d)\) 元 GF 的幂 . 短多项式求幂就是经典的应用 ODE 求解的问题了 .

实际实现还是得分 \(d=1,2,3,4,6\) 讨论做(

[WC2020] 有根树

注意到如果 \(u\)\(v\) 祖先那么一定 \(w_u>w_v\),从而 \(C\) 肯定是从大往小选最优 .

注意到要最小化 \(\max\{|C|,\max_{i\notin C}\{w_i\}\}\),由单峰可以发现当 \(|C|=\max_{i\notin C}\{w_i\}\) 时取到最小值。

考虑加点和删点对答案的影响,不妨考察加点 . 贡献分为两部分,加一个点最多让 \(\max_{i\notin C}\{w_i\}\) 加一,同时可能会使得 \(\max_{i\notin C}\{w_i\}>\min_{i\in C}\{w_i\}\),这时交换两边最值即可,不会产生影响 . 如果加入的点的 \(w\) 比原来的 \(\max w\) 大那么就加到 \(C\) 里 . 从而可以发现每次加点或删点答案最多动一步 .

从而考虑动态维护 \(C\) 然后调整 . 钦定 \(|C|\le\max_{i\notin C}\{w_i\}\),因为如果不然可以不断在 \(C\) 中加入元素使得等号成立 . 可以发现问题的核心是维护 \(\max_{i\notin C}\{w_i\}\) .

这里的问题是链加集合查最值,可以树剖到 2 log .

注意到只需要维护最值,那么对于每个重链考虑,链上的最值肯定是端点,链间的信息需要一个支持加元素删元素查最值的数据结构,\(O(n\log n)\) 次修改 \(O(n)\) 次查询 . 用简单数据结构是无法突破 2 log 的 .

考虑到最值每次最多变一步,所以只需要维护每个值是否存在,对每个值维护一个链表即可 \(O(1)\) 完成 .

这里修改的时候可能会对链产生 \(O(1)\) 的影响,可以对每条链开一个 set 维护,同时需要一个树状数组来支持查 \(w\) .

总之就 \(O(m\log n)\) 完成了 . 代码是不可写作的 .

[WC2021] 括号路径

考察括号序列的构造就是从空串开始每次在外面套一层括号或者把两个括号拼起来 .

因为如果有边 \((u,v,w)\) 就一定有 \((v,u,-w)\) 所以如果 \(u-v\) 是合法路径那么 \(v-u\) 肯定也是 .

从而每次找一个匹配的三元链并查集缩起来最后对每个块算就行了 . 需要 map 启发式合并边集 .

写起来有点奇怪 .

CF1148G Gold Experience

竟然是和 Holy Diver 相邻的题目 .

先找到一组 \((x,y,z)\) 满足 \(\gcd(a_x,a_y)=\gcd(a_x,a_z)=1\),称为预备三元组 .

讨论:

  • 存在 \(k\) 个点和其它所有点都连了边:答案就是这 \(k\) 个点 .
  • 不存在 \(k\) 个点和其它所有点都连了边:
    • 不能找到预备三元组:此时每个点的度数都不大于 \(n-1\),考虑补图找独立集,每个连通块找一个即可,因为 \(2k\le n\) 所以 \(\frac n2\ge k\),也就表明一定能找到 .
    • 能找到预备三元组 \((x,y,z)\)
      • \(k=3\):答案就是这个三元组 .
      • \(k>3\):注意到所有没与其它所有点都连了边的点再加上预备三元组构成了一个补图上的团,并且其大小 \(S>n-k\ge k\) .
        那么只需要考虑将集合的大小缩至 \(k\) . 考察点集的一个前缀,令 \(f(n)\) 表示只考虑前 \(n\) 个点的情况下,没与其它所有点都连了边的点的数量 .
        二分 \(R\) 使得 \(f(R-1)<k-3\)\(f(R)\ge k-3\),令集合 \(A\) 是前 \(R-1\) 个点中与 \(a_R\) 互质的点,\(B\) 是只考虑前 \(R-1\) 个点的情况下,没与其它所有点都连了边的点 .
        • \(k>f(R-1)+4\):答案的组成如下:
          • \(B\) 中所有元素 .
          • \(R\) .
          • \(A\) 中任意 \(k-|B|-4\) 个元素 .
          • \(x,y,z\) .
        • \(k=f(R-1)+4\)
          • 存在 \(t<R\)\(t\notin B\) 使得 \(a_t\perp a_R\):答案的组成如下:
            • \(B\) 中所有元素 .
            • \(R,t\) .
            • \(x,y\) .
          • 不存在 \(t<R\)\(t\notin B\) 使得 \(a_t\perp a_R\):此时一定存在 \(t\in B\) 使得 \(a_t\perp a_R\),否则与 \(f(R-1)<f(R)\) 矛盾 . 答案的组成如下:
            • \(B\) 中所有元素 .
            • \(R\) .
            • \(x,y,z\) .

所有情况全部讨论完毕,抄一遍即可通过 . 算度数也就是互质数量可以对素因子容斥 .

[USACO21OPEN] Routing Schemes P

建立超级点 \(u\)\(u\) 连所有 sender,所有 receiver 连 \(u\),问题即为欧拉回路计数,BEST 定理即可 .

[北京省选集训2019] 生成树计数

因为 \((\sum w_i)^k=[z^k/k!]\prod_{i=1}^m\mathrm e^{w_iz}\),所以以 \(\mathrm e^{w_iz}\) 为边权做矩阵树定理即可 . 这里可以截断到 \(k\) 直接暴力卷积 .

[集训队互测 2021] 数列重排

好像还是普及模拟赛的 trick .

对于 \(f(x)\) 来说,\(<x\) 的数循环填即可,考虑依次插入 \(\ge x\) 的数 . 如果当前有 \(r\) 个元素,当前插入的元素是这个 \(\ge\) 连续段的第 \(i\) 个,讨论插入的位置在两边或是中间:

  • 两边:\(\Delta=r-i-k+1\) .
  • 中间:\(\Delta=k-i-2k+2\) .

容易发现肯定是前 \(2k-2\) 个对半放两边,剩下的每个连续段循环放 .

那么把上面的过程做出来就可以 \(\Theta(m)\) 完成题目了 .

洛谷 P7246 手势密码

那个贪心是真的迷惑,还是写个线性规划吧 .

\(x_S\) 表示路径 \(S\) 的操作次数,则问题即为:

\[\begin{array}{cl} \text{minimize } & \sum x_S \\ \text{s.t. } & \sum_{S \ni u} x_S \ge a_u \\ & \sum_{S \ni u} -x_S \ge -a_u \\ & x_S \ge 0 \end{array} \]

对偶之:

\[\begin{array}{cl} \text{maximize } & \sum a_u (s_u - t_u) \\ \text{s.t. } & \sum_{u \in S} s_u - t_u \le 1 \\ & s_u, t_u \ge 0 \end{array} \]

\(b_u=s_u-t_u\),则问题为限制每条路径的 \(\sum b_u\le 1\),求 \(\max\sum a_ub_u\) .

\(dp_{u,d}\) 表示 \(u\) 子树内向上链和最大为 \(d\) 的答案即可,因为 \(d\)\(b_u\) 都只有 \(\Theta(1)\) 个值有意义,从而 \(\Theta(n)\) 解决 .

[USACO23FEB] Watching Cowflix P

首先注意到每两个连通块之间距离至少为 \(k\) 否则连起来更优所以连通块数是 \(O(\frac nk)\) 级别的,考虑根号分治:

  • \(k<\sqrt n\),固定 \(k\)\(dp_{u,0/1}\) 表示考虑 \(u\) 子树 \(u\) 不选/选的答案 .
  • \(k\ge\sqrt n\)\(dp_{u,b,0/1}\) 表示考虑 \(u\) 子树内 \(b\) 个连通块不选/选 \(u\) 的答案 .

那么就是 \(\Theta(n\sqrt n)\) 的了 .

CF986F Oppa Funcan Style Remastered

分解 \(n\),如果是素数就直接做,有 2 个素因子那么就 exgcd,否则素因子至少比 \(10^6\) 小,可以跑同余最短路 .

[GXOI/GZOI2019] 旧词

考虑差分把 LCA 的贡献分解到 LCA 至根的链上,查询时查链上每个点的贡献之和 .

因为 LCA 的根链就是两点根链的交,所以对于 \(\sum_if(\operatorname{dep}(\operatorname{lca}(i,x)))\) 来说枚举 \(i\) 在根链上更新贡献,然后对于每个 \(x\) 求链和即可 .

树剖后就是一个区间加 \(a_i\) 区间求和的东西,线段树即可 .

[AGC058F] Authentic Tree DP

注意到 \(f(t)\) 有组合意义:模数是 \(p\),对于每条边拆出来一个点,然后往外连一条点数为 \(p-1\) 的边,则问题即为随机删点,要求所有边拆出来的点比它相邻的点后删的概率 .

可以看成随机定向,每条边都从从边点出发的概率:

考虑容斥,把每个往上连的边的方向改下来或者删了,容斥系数就是 \(-1\) 的改方向的边的数量次方 .

\(dp_{u,k}\) 表示考虑以 \(u\) 为根的子树 \(\operatorname{size}(u)\equiv k\pmod p\) 的概率即可 .

根据树上背包时间复杂度为 \(O(n^2)\) .

posted @ 2023-12-29 20:17  Jijidawang  阅读(108)  评论(2编辑  收藏  举报
😅​