寒假集训杂题选记

写在前面

集训杂题杂记。

很多题的小 trick 挺有意思但不值当的单独拿出来,简单记录一下。

6-基础数论

这就触及到我的知识盲区了……

数论我是真不熟啊真不熟

说的好像其他的我多会一样嘻嘻

  • CF1627D
    由算数基本定理有 \(\gcd\) 的传递性:\(\gcd(x, \gcd(y, z)) = \gcd(\gcd(x, y), z) = \gcd(x, y, z)\),问题变为从原数组中任意多个元素的 \(\gcd\) 的种类数(满足不在原数组中)。套路地枚举 \(i = \gcd\),检查是否有:原数组中 \(i\) 的倍数的 \(\gcd =i\) 即可。
  • CF1557C
    \(n\) 奇偶讨论。\(n\bmod 2 = 0\) 则有 \(\operatorname{and}=1\) 的位 \(\operatorname{xor}=0\),枚举最大的 \(\operatorname{and}=1\) 位,更大的位保证 \(\operatorname{and}=\operatorname{xor} = 0\),更小的位随便填,答案累加即可;\(n\bmod 2 = 1\) 则每一位要么均为 1,要么 \(\operatorname{and}=\operatorname{xor} = 0\),直接快速幂即可。预处理 2 的幂处理少了,无时无刻不感觉自己是傻逼。
  • CF451E
    没有 \(f_i\) 限制即将 \(s\) 个球放入 \(n\) 个盒子且允许非空,答案即 \(C_{s + n - 1}^{n - 1}\)。有限制考虑反面,求至少不满足某一 \(f_i\) 限制的方案数,然后考虑容斥,求不满足限制 \(f_{j_1}, f_{j_2}, \dots\) 的方案数。则对于第 \(j\) 个限制至少取了 \(f_{j_1} + 1\) 个球,除此之外没有其他限制,则方案数为:\(C_{(s + n - 1) - (f_{j_1} + 1) - (f_{j_2} - 1) - \dots}^{n-1}\)\(n\) 较小则可直接状压枚举不满足的限制的集合,于是做完了。
  • P3802 小魔女帕琪
    知识盲区……当时没做是因为真不会,虽然现在也不太懂。考虑一个长度为 \(n = \sum a_i\) 的序列,每连续 7 个元素贡献为 1 的概率均为 \(A_{7}^{7} \times \prod_{i=1}^{7} \frac{a_i}{n - i + 1}\),这样的连续段共有 \(n-6\) 个,则期望总贡献为 \((n - 6)\times A_{7}^{7} \times \prod_{i=1}^{7} \frac{a_i}{n - i + 1}\)
  • P5656 【模板】二元一次不定方程 (exgcd)
    麻烦的一批的玩意儿。详见:https://www.cnblogs.com/luckyblock/p/17113342.html
  • P4783 【模板】矩阵求逆
    一种好理解的使用了 Gauss-Jordan 的方法,详见:https://www.cnblogs.com/luckyblock/p/17113494.html
  • P3807 【模板】卢卡斯定理/Lucas 定理
    适用于模数较小且为质数(需要求逆元)的情况。尝试默写一下:

    \[\left(\begin{matrix}n\\m\end{matrix}\right) \equiv \left(\begin{matrix}n\bmod p\\m\bmod p\end{matrix}\right)\times \left(\begin{matrix}\left\lfloor\frac{n}{p}\right\rfloor\\\left\lfloor\frac{m}{p}\right\rfloor\end{matrix}\right) \pmod p \]

    什么嘛,我写的还是挺对的嘛。
  • P2158 [SDOI2008] 仪仗队
    实质上是求斜率的种类数。先考虑点阵的一半(先不考虑直线 \(y=x\) 上的点 \((1,1)\)),发现斜率相同的的点集 \(\{(i, j)\}\) 中做出贡献的是 \(i,j\) 最小的点,且满足 \(\gcd(i, j) = 1\)。则点阵的一半的贡献即 \(\gcd(i, j) = 1\) 的点对数量,即 \(\sum_{x=1}^{n-1} \varphi(x)\),答案即 \(1 + 2\times \sum_{x=1}^{n-1} \varphi(x)\)

5-图论

  • P3385 【模板】负环
    Spfa 判负环,记录最短路径节点数量,大于 \(n\) 说明出现负环。注意 Spfa_dfs 是个假算法,hack。用 Bellman-Ford 更好写,图都不用建。
  • P5960 【模板】差分约束算法
    注意到不等式有传递性,建立图论模型,\(x_i -x_j\le k\) 则从 \(j\)\(i\) 连一条权值为 \(k\) 的单向边,若存在环则环上的点 \(u\) 满足 \(x_u-x_u \le \sum{k}\),则图上有负环无解,否则有无数组解。考虑构造一组解:建立超级源点向每个点连单向边,权值为 0,无负环则从超级源点到其他点均有最短路,其中某些点最短路为 0。根据每条边有 \(\operatorname{dis}_i \le \operatorname{dis}_j + k\),则每个点的最短路的值均满足约束条件,\(\operatorname{dis}_u=0\) 等价于钦定 \(x_u = 0\),这样可以得到满足所有 \(x_i\le 0\)\(x\) 的最大解。
    类似地,将 \(x_i-x_j\le k\) 变形为 \(x_j\ge x_i - k\),从 \(i\)\(j\) 连一条边权为 \(-k\) 的边,加入超级源点后求最长路可得所有 \(x_i\ge 0\)\(x\) 的最小解。
  • CF1385E
    结论:仅考虑有向边时无环则存在构造方案。证明:考虑拓扑序,有环则拓扑排序中某拓扑序大的节点指向了拓扑序小的节点,则构造时钦定无向边从拓扑序小的节点指向拓扑序大的节点即可。
  • P2047 [NOI2007] 社交网络
    Floyd 处理最短路数量,顺便维护“当前求得的最短路”的数量(非最终的最短路)。
  • P1073 [NOIP2009 提高组] 最优贸易
    这题数据好像水的一批怎么做都能草过去,怪不得当时没写。Tarjan 一下 bfs 求到该点的前缀答案最大值即可。注意别缩点后还用原图编号妈的。
  • P3403 跳楼机
    用最短路算法优化的同余系下的 DP,详见:https://www.cnblogs.com/luckyblock/p/17108809.html
  • P2662 牛场围栏
    于上题类似,先通过是否有 1 以及是否 \(\gcd > 1\) 判断是否有解,选定最短的长度 \(x\) 为模数,则对于某个 \(i\in [0, x-1]\)\(f_i-x\) 为最大的不能被表示的数,求最大值即可。
  • CF821D
    很纠结要不要把这题独立出来……想想算了,也不是什么很需要脑子的题。不能在坐标系上直接建图,将有路灯的坐标看做节点,在原图上在相邻的路灯间连边,边权为 0。新建 \(n+m\) 个超级点分别代表将某行/列点亮后的行/列,从所有能到达该行/列的路灯(在该行列以及相邻)向它们连边,边权为 1,同时连反向边,权值为 0。若 \((n, m)\) 有路灯则求到该点的最短路,否则求到代表第 \(n\) 行和第 \(m\) 列的超级点的距离。注意实现时需要用 map 动态地分配点编号。
  • P3716 [CTSC2000]冰原探险
    思路不难,实现上有一点难写,于是贺了份题解嘻嘻。bfs 维护到达某坐标的最少移动次数,转移时枚举上下左右距离最近的冰块并滑动到该冰块的边上,直至在某坐标上能直接到达终点。
  • P7624 [AHOI2021初中组] 地铁
    二分答案+差分约束,详见:https://www.cnblogs.com/luckyblock/p/17109093.html
  • P3008 [USACO11JAN]Roads and Planes G
    给的限制很有意思,单向边间 Topsort 到达双向边的连通分量间跑最短路。懒得写了于是 Spfa 直接水过去了。
  • P4674 [BalticOI 2016 day1]Bosses
    从上司向下属连边,数据范围不大,枚举固定最终 boss,问题变为构造一棵搜索树并赋值代价,使得代价和尽可能小。搜索树上叶节点代价应取 1,则非叶节点代价最小为子树大小。为最小化子树大小和应使树高尽可能小,取 bfs 树即可。

4-DP

  • AT_dp_f
    输出方案记录转移前驱,输出时当前位置对答案有贡献则输出当前位置,之后跳转到前驱。
  • P1819 公共子序列
    \(f_{i,j,k}\) 表示以 \(a_i,b_j,c_k\) 结尾的公共子序列的方案数,转移时枚举下一个相同位置填表,输出答案求和 \(f\)
  • CF1528B
    进行一个题解的观测。如果出现不等长的圆弧,则一定是最长的等长圆弧在最外侧相交,中间的部分空下给其他圆弧。如果圆弧均等长则只有一种方案,且圆弧长度一定是 \(2n\) 的约数。总上,设 \(f_i\)\(n=2i\) 的方案,则 \(f_i = \operatorname{d}_i + \sum_{j=1}^{i-1} f_j\)\(\operatorname{d}(i)\) 表示 \(i\) 的约数个数。
  • P1063 [NOIP2006 提高组] 能量项链
    区间 DP,断环后成长度为 \(n+1\) 的序列 \(b\)\(b_i\) 代表珠子 \(i\) 的头元素,为方便 DP 钦定 \(b_{i+1}=b_1\)\(f_{i,j}\) 表示珠子 \([i,j]\) 合并的最大值,转移枚举两段的分界 \(k\) 代表右边一段的开头,\(f_{i,j} = \max_{1\le i<k\le j\le n} f_{i,k-1} + f_{k,j} + b_{i}\times b_{k}\times b_{j + 1}\)\(n\) 次 DP 取 \(f_{1,n}\) 最大值即答案。总复杂度 \(O(n^4)\) 级别,\(O(n^3)\) 则省去断环直接展开成长度为 \(2n\) 的序列。
  • P4342 [IOI1998]Polygon
    大致思路同上,由于出现了负数,另记一个最小值,转移时讨论。另外很好奇这题怎么卡的 getchar,牛逼。
  • CF1223D
    考虑保留一组数的条件,当且仅当这些数数值连续且递增,且前者最后一次出现位置在后者第一次出现位置之前。离散化后预处理一下数值相邻的数是否满足上述条件,求最长连续符合条件的段即可。
  • CF1061C
    先记个朴素的状态:\(f_{i,j}\)\(i\) 个数长度为 \(j\) 的子序列的个数,有 \(f_{i,j} = f_{i - 1, j} + f_{i-1, j-1}[j \mid a_i]\)\(a_i\) 的约数可以 \(O(\sqrt{a_{i}})\) 地枚举,但是要枚举 \(j\),总复杂度还是 \(O(n^2)\) 级别。发现 \(i\) 这一维没什么用,并且枚举的 \(j\) 中无用的转移太多。考虑减去一维,在枚举过程 \(i\) 中维护 \(f_j\) 表示长度为 \(j\) 的子序列个数,转移时 \(O(\sqrt {a_i})\) 地枚举约数,记录下来并倒序地仅对约数的位置进行转移,避免无用的重复的更新。答案即 \(\sum_{i>0} f_i\)。久违的 1A,感觉脑子有点好用,这,就是玩仁王带给我的资本。
  • P1081 [NOIP2012 提高组] 开车旅行
    我居然没写过,乐。先考虑如何暴力模拟,set 预处理出 A/B 从每个城市出发到达的下一个城市,回答询问时不断前进,然后考虑倍增优化前进的过程即可。详见:https://www.cnblogs.com/luckyblock/p/17058544.html
  • P4766 [CERC2014]Outer space invaders
    一开始写线性 DP 被卡,没看懂题解的优化为什么对于是自己怒交一篇。区间 DP,设 \(f_{i,j}\) 表示将满足 \(i\le a_p < b_p\le j\) 的外星人全部消灭的代价,转移时钦定满足 \([a_p,b_p]\subseteq [i,j]\)\(d_p\) 最大的外星人 \(\operatorname{id}\) 是在最后一次操作中被消灭的,\(f_{i,j} = \min_{k=a_{\operatorname{id}}}^{b_{\operatorname{id}}}\left( f_{i, k - 1} + f_{k + 1, j} + d_{\operatorname{id}}\right)\)。详见:https://www.cnblogs.com/luckyblock/p/17056671.html
  • P1006 [NOIP2008 提高组] 传纸条
    当时还是小孩子不懂事抄完题解就跑了……设两人都是从 \((1,1)\) 出发,设 \(f_{i,j,k,l}\) 表示 A 走到 \((i,j)\),B 走到 \((k,l)\) 的最大价值和。转移时枚举左上的位置,若 \(i=k \land j=l\) 则令 \(f_{i,j,k,l}\) 减去 \(a_{i,j}\),即重复路径只做一次贡献。可证明总存在不劣于重复路径的第二条路径,则这样简单去重后也可得到最优解。\(O(n^3)\) 方法则通过 \(i+j = k+l=\) 步数,直接计算出 \(l\) 来避免了枚举。
  • P1048 [NOIP2005 普及组] 采药
    \(f_{i,j}\) 设时间 \(i\),对前 \(j\) 种药进行采集可获得的最大价值。转移时枚举每一种药 \((t_j, v_j)\),有:\(f_{i,j} = f_{i - t_{j}, j - 1} + v_j\),把第二维滚动掉,防止重复更新,转移时枚举 \(i\) 倒序枚举。
  • P1616 疯狂的采药
    同 01 背包,\(f_{i,j}\) 设时间 \(i\),对前 \(j\) 种药进行采集可获得的最大价值。转移时枚举每一种药 \((t_j, v_j)\) 和采的个数,有 \(f_{i,j} = f_{i - k\times t_{j}, j - 1} + k\times v_j\),把第二维滚动掉,可重复更新,转移时枚举 \(i\) 正序枚举。
  • P1064 [NOIP2006 提高组] 金明的预算方案
    伪树上背包,01 背包 + 讨论依赖情况。
  • P2014 [CTSC1997] 选课
    真树上背包,\(f_{u, i}\) 表示钦定选择了 \(u\),在节点 \(i\) 的子树中共选择了 \(j\) 个节点能获得的最大价值。初始化 \(f_{u, 1} = v_u\),转移时按顺序枚举儿子 \(v\) 以及从儿子中选择的节点数量不断更新 \(f_{u, i}\),有:\(f_{u, i} = \max_{1\le i\le m+1, 0\le j<i}(f_{u, i - j} + f_{v, j})\),答案即 \(f_{0, m + 1}\)(保证选择节点 0,并从 0 的子树中选择了 \(m\) 个节点)。

3-树状数组与线段树

  • CF438D
    线段树维护,记录区间最大值,最大值小于模数跳过,否则暴力修改。易证 \(x \bmod p<\frac{x}{2}(p<x)\),一个数至多取模 \(\log\) 次,只有单点修改,复杂度可以保证。
  • P2894 [USACO08FEB]Hotel G
    线段树维护区间最大空房,区间最大前后缀空房。开房退房操作即区间 0/1 覆盖,查询时考虑答案在区间左右儿子中或是跨越中点即可。
  • P4198 楼房重建
    做过,但是只记得要维护单调栈。答案即整个序列单调栈的大小,考虑维护区间单调栈大小和区间最值,单点修改 pushup 时讨论区间右儿子对单调栈的影响,详见该文:https://www.cnblogs.com/luckyblock/p/13556835.html
  • CF920
    没几次操作后 \(a_i\) 便会变为 1 或 2,同 CF438D,线段树记录区间最大值,大于 2 则暴力改,否则跳过;查询直接查区间和。
  • CF444C
    记录区间是否为同种颜色,修改时区间为同种颜色则直接打标记,否则暴力改。每次修改最多增加两个断点,最多引起查询时增加一次递归。注意懒标记要记录颜色和权值增量。
  • P6477 [NOI Online #2 提高组] 子序列问题
    区间无重问题,套路的枚举区间右端点,线段树维护区间种类数,端点右移对应区间+1,拆开完全平方式维护区间平方即可。
  • P6186 [NOI Online #1 提高组] 冒泡排序
    需要一点脑子的题,但是我没有,嘻嘻。题解:https://www.cnblogs.com/luckyblock/p/17050214.html
  • P5490 【模板】扫描线
    忘了怎么写了笑死我了
  • P1502 窗口的星星
    考虑窗口右上角在什么范围内可以包含某个星星,问题转化为求加权矩阵覆盖的最大权值点,扫描线即可。upd:注意边框上的不算,且目标点不一定是整点。考虑取 x.5 的点作为目标点,并且注意扫描时 +/- 的顺序。调了好久= =

2-字符串(KMP,EXKMP和tire)

1-贪心和二分

  • P1016 [NOIP1999 提高组] 旅行家的预算
    显然应当尽量在较便宜的站加满油,考虑按油价递增的单调队列维护当前油箱里油的来源和每种油的量,每到一站先消耗队列头的对应量的油,然后再把油加满,如果这一站的油较便宜则回退之前站购入的油。按此规则模拟即可。

写在最后

我是菜鸡。

posted @ 2023-01-12 17:01  Luckyblock  阅读(117)  评论(2)    收藏  举报