9月杂题

为什么 19 号了才开始写杂题

1. ZJOI2018 胖

考虑一个新增边能松哪些点。它会被其它新增边影响。感受一下,松的范围一定是一个区间。如果 \(|x-x_i|>|x-x_j|\)\(b_i+|s_x-s_{x_i}|>b_j+|s_x-s_{x_j}|\)\(i\) 就松不到 \(j\) 。二分边界,RMQ 判断即可。以左端点为例 , \([mid,i]\) 内不能出现一个满足 \(b_j<s_{x_i}-s_{x_j}+b_i\) 的,否则就直接 G 了。然后不能让 \([2mid-i,mid]\) 松到 \(mid\) ,即不能有 \(b_j+s_{mid}-s_{x_j}<b_i+s_{x_i}-s_{mid}\)

2. ARC165F Make Adjacent

转化略。记一个好的建图方法:考虑按 \(l\) 排序后分治,就可以转成前缀优化建图。具体地,令当前分治到 \([L,R]\) ,将区间内的点的 \(r\) 离散化,建立一串点 \(x_1,x_2,...,x_{R-L+1}\) ,连边 \((x_i,x_{i+1})\);对于左半部分的点 \(u\),连 \((u,x_{r_u})\) ;右半部分的点连 \((x_{r_u},u)\) 。实现的精细一点就是 \(O(n\log n)\)

3. CF1870F Lazy Numbers

我们考虑位数相同的数,它满足 \(f(x)>f(x-1)\) !由此 \(f(x)-x\) 单调不降,二分即可。求 \(f\) 很 easy 啦。晚上就是脑壳昏啊,当然这个也挺好玩的。

4. ABC320G Slot Strategy 2(Hard)

有点妙,就是说我们有一个 naive 的想法是枚举每个数字,二分 check,check 就是判有没有匹配。但这样右部点和边数都很多啊。有个结论是,对每个左部点我们只需保留 \(n\) 条边,从 hall 定理的角度想想发现确实。这样点数和边数都是 \(O(n^2)\) ,然后 dinic 跑匹配,复杂度 \(O(dN\sqrt{M}\log n)=dn^3\log n\)

5. CF1466H Finding satisfactory solutions

题意罗里吧嗦,先转化一下。就是说图上已经有蓝边 \((i,a_i)\) ,然后还可以连一些红边 \((i,j)\) ,如果一个 \(i\) 连出去 \(x\) 个边方案就乘上 \(x!(n-1-x)!\) ,最后使得图上不存在一个环至少有一条红边。那首先蓝边形成了若干个环,环内一定不能连边,我们就把蓝环缩起来。就变成类似于 DAG 计数的题了。还有一个点是我们不能直接把蓝环的集合记下来,但你发现有一些集合是等价的。集体地,如果两个集合满足:对于所有 \(x\) ,大小为 \(x\) 的蓝环个数相同,那它们就等价。发现等价类很少,至多 \(1440\) 个!这个题就做完了。

6. CF750G New Year and Binary Tree Paths

考虑枚举这个路径往左和往右分别走了多少,发现根是唯一的!因为设根是 \(x\) ,因为你发现它能凑出来的和形如 \([kx+b_1,kx+b_2]\) ,并且 \(b_2-b_1<k\) 。剩下的怎么凑就是数形 dp 算一算。

7. CF1804H Code Lock

很特殊的一个题。\(2^{32}\) 很大,但是 \((C_{16}^8)^2\) 不大(

我们一定是要考虑这个贡献,这个环上距离有什么性质的。比如说 \(n\) 是偶数,画 \(\frac{n}{2}\) 条对角线,发现这个距离就是被线隔开的次数。由此,我们枚举一开始线左边的点集,然后旋转这根线,就只需要记下当前左边的点集即可确定状态。

8. baekjoon23510 Wise man

一步一步跳太慢了!考虑一些跳的过程是相同的,我们就可以把这些划出来大段的跳。具体地,如果我们当前形成了 \(x000...00y_1\) 的形式,就可以尝试大跳,跳到 \((x+1)000...00y_2\) 。而且你还发现这个只和 \(x\) 的 maxdigit 有关,于是我们设 \((x,t,y_1)\) 表示前面一段的 maxdigit 是 \(x\) ,个位是 \(y_1\) ,中间有 \(t\)\(0\) ,然后我们求出跳到下一个状态的步数和 \(y_2\) 的值。说白了就是想办法对“路径”划分,把每段当成一个黑盒走就完了。

9. CF643F Bears and Juice

我们形式化问题,就是考虑每个酒罐,它要取一个人的子集 \(S\),表示 \(S\) 内的人喝了它。令 \(p:=min(n-1,p)\) 。则我们需要 \(popcount(S)\le p\) 。由于我们需要每种情况都能 win ,考虑对于一个 \(S\) ,有多少酒罐可以取它?我们设原问题的答案是 \(f(n,d,p)\) ,则可以递归至 \(f(n-pp(s),d-1,p-pp(s))\) 。那我们有 \(f(n,d,p)=\sum\limits_{i=0}^pC_n^i f(n-i,d-1,p-i)\) 。那第一, 全局的 \(n-p=a\) 都是固定的,转化成只记录 \(d\)\(p\) ,即 \(f(d,p)=\sum\limits_{i=0}^pC_{p+a}^i f(d-1,p-i)\)\(f(0,p)=1\) 。第二,我们再转化一下问题,即一张 DAG ,初始点随意,每次可以带在原地或者走到另一个点,要通过 \(d\) 步走到一个终点。先考虑没有自环,我们直接 \(O(p^3)\) dp。然后我们对一个 \(d\) 算答案时,枚举走了多少次自环即可。复杂度 \(O(p^3+pq)\)

10. P7058 [NWRRC2015] Kingdom Trip

dp 是显然的,关键在于怎么 check 一对 \((i,j)\) 是合法的。考虑中间的一个 \(k\) ,以点 \(k\) 为圆心做一个半径为 \(d\) 的圆,从点 \(i\) 出发做两条切线,则必须包含 \(j\) ;同样的从 \(j\) 出发也要包含 \(i\)

这下就简单了:我们把这个限制拆成两半。以前半部分为例,我们枚举 \(i\) ,从小往大扫,每次要加入一个 \(k\) 的限制,发现合法的点 \(j\) 的范围可以用一个极坐标的区间表示。 这个题就做完了。

11. CF1025G Company Acquisitions

这是怎么想到的?

尝试定义一个势能函数 \(h(x)\) ,设一个红点后面挂的点数是 \(a_i\) ,则我们需要总势能 \(\sum h(a_i)\) 每次增加 \(1\) 。 解方程发现 \(f(x)=2^{x}-1\) 就满足条件,这个题就做完了。

12.
P6545 [CEOI2014] The Wall

好神秘。考虑从左上角到一个关键点的最短路径,你发现最后取的路径一定包含它!然后再拆点跑最短路,要求不能跨过这些关键边即可。

13.
P8350 [SDOI/SXOI2022] 进制转换

在三进制下从高到低填这个数,它会不断对二进制造成影响。虽然加的数越来越小了,但是还是会往高进位啊,怎么办呢。

天才的想法:直接假设后面的数是否会进位即可。即状态 \((x,st,k)\) 表示我们在三进制下还有 x 位没填,能直接影响的位置在二进制下是 st ,\(k\) 代表最后是否会向高处进位。然后呢把这个过程劈成两半即可,我们暴力枚举高位填的数,记忆化低位,复杂度 \(O(B+\frac{n}{B})\) ,取到 \(O(\sqrt{n})\)

14.
P8349 [SDOI/SXOI2022] 整数序列

根号分治,难点在于大对小怎么搞。你发现对于一个 “小” 的长度为 \(x\) 的连续段,它左右两段长度为 \(x+1\) 的 "大" 是有效的。由此有效的“大”个数就被压成“小”了。

15. [0902 B组] T4

题意:给你一个序列,支持区间染色,以及查询:所有满足 \(a_i=x,a_j=y\) 的二元组 \((i,j)\)\(|i-j|\) 的最小值。

做法:考虑分块维护,区间染色就是整块打 tag 散块重构。重点是查询,所以我们需要思考维护哪些信息。查询的时候可以按照 \(i,j\) 的关系分为两种情况:块内,块间。

块内:我们预处理块内两两颜色间的答案,这是 \(O(B^2\frac{n}{B}=nB)\) 的;每次重构时我们只需要考察那些被修改的颜色,所以时均摊 \(O(B)\) 的;查询时直接扫一遍所有块统计答案即可,是 \(O(\frac{n}{B})\) 的。

块间:预处理每个块中某颜色第一次出现和最后一次出现的位置即能方便查询。重构时是类似的均摊。

总复杂度 \(O(n\sqrt{n})\)

16. [0430 A组]T3

首先转化一下问题:建树,满足编号是按 dfn 序排的。每个点是黑/白状态。需要支持:1. 反转区间 \([l,r]\) 内点的颜色。2.查询由 \([l,r]\) 构成的森林中,提出黑点的虚树大小。有部分分:\(l=1\)

\(n,m\le 2*10^5\)

\(l=1\) 怎么做呢。直接利用 \(\sum d_{u_i}-\sum d_{lca(u_i,u_{i+1})}\) 计算即可,每个节点维护最左和最右的黑点以及当前的答案,利用 \(O(1)\) LCA 维护即可,复杂度 \(O(n\log n)\)

现在尝试用 \([1,r]\) 的答案减掉 \([1,l-1]\) 的答案。但我们发现这样并没有减完,具体的,有一些 \(<l\) 的点 \(x\) 子树内最小的黑点 \(y\) 满足 \(l\le y \le r\) 。我们画个图,发现这些点在 \(1\)\(l-1\) 的链上形成了连续的一段。由此倍增计算即可。复杂度 \(O(n\log^2 n)\)

17.[0909 B组]T4

考虑按照 \(R\) 把序列分段,观察两种操作,发现每次删掉的 \(P\) 位置是递增的。于是尝试从前往后处理每个段来 dp 。我们设状态为:最后一个 R 的位置 \(i\),要求前面的 P 都删完了,还能删 \(j\) 个 S。但是我们要注意到,如果此时两端都是 P 进行操作 2 ,就会影响后面的 S 。于是我们还需要把这个次数 \(k\) 给记下来。每次转移的时候为了计算 \(i\) 出的答案,我们需要枚举前一个 R 的位置,然后另设一个状态,同样记下来 \(j,k\) ,但是还要记录两个 R 之间的状态:即段长,第一个是 P 还是 S。复杂度 \(O(n^4)\) 。这个题难点在于能不能想清楚。。。

18.[0920 A组] T2

考虑 \(a_x\) 表示连完子树 \(x\) 内的边之后形成了 \(a_x\) 条链。那我需要 \(\sum a_x=\frac{K}{2}\) 。并且 \(1\le a_x\le \min(sz_x,n-sz_x)\) 。考虑一开始令 \(a_x=\min(sz_x,n-sz_x)\) ,为了让总和满足条件,每次找到最大的 \(a_x\) 并减 \(1\) ,这是容易 \(O(n)\) 实现的。有了 \(a_x\) 之后构造是简单的。实现的精细一点就是 \(O(n)\) ,但 \(O(n\log n)\) 也能过。

19. [0920 A组] T3

神神神。只写第 2 问。整理一下 zjk 写的。

EGF 转 OGF trivial。我们现在计算出了 \(F_c(x)\) 表示 \(i\) 步后达到转到状态 \(c\) 的概率。设 \(H_c(x)\)\(i\) 步后为 \(c\) 且之前都不会 \(c\) 的概率。设 \(R_c(x)\)\(i\) 步后转回 \(0\) 且中间无 \(c\) 的概率。则 \(H_c(x)=\frac{F_c(x)}{F_0(x)}\)\(R_c(x)=F_0(x)-H_c(x)F_{-c}(x)\) 。其实这里还应该设一个 \(P_c(x)\)\(i\) 步后第一次转回 \(0\) 且无 \(c\) 的概率。那么 \(R_c(x)=\frac{P_c(x)}{1-P_c(x)}+1\)\(c\) 对答案的贡献就是 \(P_c(1)^k=(1-\frac{1}{R_c(1)})^k\)\(R_c(1)=F_0(1)-\frac{F_c(1)F_{-c}(1)}{F_0(1)}\) 。但你发现这四个数都趋于无穷啊,怎么算呢。我们设 \(v_c=F_0(1)-F_c(1)\) 。则上式改写为 \(F_0(1)-\frac{(F_0(1)-v_c)(F_0(1)-v_{-c})}{F_0(1)}\) 。有 \(\lim_{x->\infty} x-\frac{(x-a)(x-b)}{x}=a+b\) 。由此,问题转化成求 \(v\) 。求 \(v\) 就是高维卷积啦,很 trivial。

20. topcoder14133 FindingFriends

挺妙的啊。先二分答案,每个点处理出来 \(L_c\)\(R_c\) ,则我们取的区间如果包含 \(c\) ,则要么得包含 \(L_c\) ,要么包含 \(R_c\) 。那就能得到限制:\(L_c<l\le c\le r<R_c\)\((l,r)\) 都不能取。做扫描线,线段树二分即可 check 。但是搜了一下,有一个更精彩的做法:从 \([l,r]\) 开始调整答案。如果此时出现一个 \(c\) 不合法,那其它任意区间也不能包含 \(c\) ,递归到 \([l,c-1]\)\([c+1,r]\) check 。我们从两头扫来找 \(c\) ,则有 \(T(n)=T(x-1)+T(n-x)+\min(x,n-x+1)\) 。这是 \(O(n\log n)\) 的。

21. gym102978E Edge Subsets

不妨令 \(A,B\) 互质且 \(A>B\) ,因为我们能拆成 \(gcd(A,B)\) 个子问题。

如果 \(A\) 较小就直接从前往后状压 dp ,复杂度 \(O(2^An)\) ,无法通过。

我们得用起来条件啊。画一个网格,把模 \(A\) 相同的位置排进一行里,并按 \(0,-B,-2B\bmod A,...,-(A-1)B \bmod A\) 的顺序把这些行串起来。然后从上往下,从左往右的考虑每个点,尝试在这个点与前面的点相连,就只有往左/上/右上的边,但有一个特殊情况:最后一行可能与第一行连边。

不妨令 \(n\)\(A\) 的倍数。 dp 时把最后 \(\frac{n}{A}\) 个点的状态和第一行 \(\frac{n}{A}\) 个点的状态记录下来,即能完成转移,复杂度是 \(O(4^{\frac{n}{A}}n)\) 的。

现在合并两个做法,取 \(\sqrt{2n}\) 即可完成平衡。复杂度 \(O(2^{\sqrt{2n}}n)\)

22. gym103855I Marbles

转化一下题意:我们建出了一棵树,每个点都有一个权值 \(s_u\) 。对每个叶子节点 \(u\) ,让深度 \(\geq d_u\) 的祖先 \(f\)\(s_f\) 加上 \(x_u\) ,其中 \(0\le x_u\le1\) 。而且限制 \(l_u\le s_u\le r_u\)

对树形 dp 的尝试是失败的。考虑网络流,拆点连边来处理上下界,即连边 \((u,u',l_u,r_u)\)。我们为了让叶子能往上做贡献,考虑对每条树边 \((x,f)\) ,有 \((x',f,0,\infty)\) 。这样如果没有 \(d_u\) 就做完了:建一个源点,连向所有叶子,把根 \(rt'\) 作为汇点。

但现在有 \(d\) 的限制怎么办呢。抛开源/汇点,如果一个叶子 \(x\) 只能贡献到 \(f\) 就停止了,连边 \((f',x,0,1)\) 即可。我们利用流量平衡巧妙的处理了“停止”的事情。

dinic 跑上下界可行流即可。

23 gym102331D Determinant

考虑邻接矩阵的行列式实际意义:选若干个环/边,使得每个点被覆盖恰好一次,系数是 \((-1)^{n-环/边数}\)

再翻译题目中的特殊性质,相当于所有边双联通分量的大小都 \(\le k\) 。把边双缩成点做树形 dp,记 \(f_{x,0/1}\) 表示我们已经考虑了 \(x\) 子树内取的环/边,\(x\) 是否被覆盖了(\(x\) 是所在边双内往上连的点)。怎么转移呢,可以先算出来一个 \(g_{x,0/1}\) 表示,考虑完所有挂在 \(x\) 上的桥边 \((x,v)\) 后,\(x\) 是否被选了。然后是边双内部的转移。先算 \(f_{x,1} ,\)直接构造行列式计算,设边双内的邻接矩阵为 \(A\) ,怎么加入 \(g\) 的贡献呢,就是让 \(A_{i,i}=g_{i,1}\) ,再对 \(i\neq j\)\(A_{i,j}\) 乘上 \(g_{i,0}\)\(f_{x,0}\) 就是挖掉 \(x\) 再算。

复杂度是 \(O(\frac{n}{k}k^3=nk^2)\) 的。

24. P7307 [COCI2018-2019#1] Teoretičar

考虑分治:每次我们把边集染成黑白两色,要求对于每个点,两个颜色的边数差 \(\le 1\) ,这可以通过建虚点跑欧拉回路实现。对两种边再分别做下去就好了。

25. P4747 [CERC2017] Intrinsic Interval

我们是可以通过传统单调栈+线段树处理这个好区间的,就是扫右端点维护 \([l,*)\)

现在要找一个最小的包含 \([x,y]\) 的子区间,我们有一个问题是:可能的 \(r\) 会有很多个啊,我们怎么维护这个答案呢。

有一个结论是,我们只需要找到最小的可能的 \(r\) , 它对应的区间一定是最小的。其中“可能”是指:以 \(r\) 为右端点的最大好区间包含 \([x,y]\) 。原因是,你考虑两个右端点 \(r_1<r_2\) ,它们分别取了一个区间,那它们的交还是合法的捏。

然后就好做了。

26. gym101205I A Safe Bet

分析一下这个添加的挡板什么情况下合法。这种一个点到另一个点的问题,很多时候都是两头考虑。考虑在 \(1\) 行左 和 \(n\) 行右分别射一道激光,我们要让这两道光对穿,那合法的挡板一定是在这两条线的交点上!由此,模拟出这两束光,处理交点就是二维数点捏。

27. gym101368D Double cyclic

复制两份,转化成求最小后缀。

我们从小到大枚举 \(σ\) 。性质 \(1\) :只有 \(σ\) 等于某个 \(m-a_i\) 时最小后缀位置会改变,而且新的最小后缀位置一定出现在这些 \(i\) 中间。

如果我们能比较出来哪个是最小的就好了,也就是需要求 lcp 。性质 \(2\):两个后缀的 lcp 是只和 \(a\) 有关的,因为 \([x=y]=[(x+σ)\bmod m=(y+σ)\bmod m]\)

这个题其实每一步都很显然,但是字符串题的难点就在于会陷入歧途。我在思考这个题时已经观察到了上面两个性质,但因为其时间相隔较大,我就忘记了性质 \(1\) 了。

我就在思考:求出 SA 之后在上面建笛卡尔树搞,从下往上算每个子树的答案然后合并。合并相当于是把 \(σ\) 分成 \(O(|son |)\) 个段,一段的答案和某个儿子 \(v\) 的答案相同。直接 fhq-treap。这就搞复杂了。

拿纸想题的重要性。

posted @ 2023-11-20 22:24  grass8woc  阅读(98)  评论(0编辑  收藏  举报