counting1

题单:counting

1.Circular Tree Embedding

首先要找一些性质。

  • 将排列循环位移后,答案不变。
  • 对于一棵树,合法的充要条件是任意一个子树对于所有排列都是一个连续的区间。

首先我们先钦定根为 \(1\),这样的话连续区间就不会出现环状。

那我们考虑先将所有排列都循环位移使得 \(1\) 为根,之后我们想要满足的是对于连边后的任意子树都为一个区间。

但是直接做的话有点麻烦,因为操作与实际排列是不同的,比如说你操作 \(1,2\) 但是连边的却是 \(p_1,p_2\),如果你的操作区间与实际使用的点的区间不同的话,这样的话就不太好刻画区间的连续。

一个比较好的处理方式是把第一个排列变为 \(1,2,3,4,...,n\),其他排列 \(p_{i,j} = p_{i,inv_{1,j}}\)。方案数显然还是一一对应的。

之后由于你的操作与对应点都变成一个区间,你就可以区间 DP 了,每次可行仅当区间操作后左右排列都是一段区间。

之后直接 DP 就可以了,复杂度 \(O(n^3)\)。

总结:感觉这道题对于性质的寻找和对细节的处理都是值得学习的。

2.King

首先发现两维几乎就是独立的了,但是不可以出现不动的情况所以需要去容斥一下,这样变成一个两维独立。

然后对于每一维进行考虑,发现有一个明显的 \(n^2\) DP,但是每次可以不动这个不太好做,我们考虑做每次不能不动的,之后再往路径中插不动的。

先再考虑不动的怎么处理,发现你可以根号分治算,小的跑暴力,大的跑双线反射容斥,复杂度是 \(T \sqrt T\) 的。

之后你再去插的话复杂度是 \(O(n^2)\),但是发现是个乘法卷积,你直接 \(NTT\) 就对了,复杂度 \(O(T \log T +T \sqrt T)\)。

3.Erase Balls 2D

首先最后剩下的点没有偏序关系的,所以你可以钦定从左往右选点。

之后你发现你直接把没有偏序关系的放在一起直接算会算重,考虑什么时候会算重。

对于选择的相邻两个点中间的部分我们是不选的,那如果存在中间一个点选和不选没有区别的话,我们就会算重。

那我们转移时只需要保证不存在这种点即可,复杂度 \(O(n^3)\)。

4.Sum of SCC

对于竞赛图的 SCC,我们有结论,缩点后为一条链,这个考虑增量应该就可以证明。

之后算答案可以拆贡献变成每条边加上一个空集向链头的边。

那我们只需要统计每条边即可,那相当于是有两个集合,内部连边不关心,外部必须是集合 \(A\) 指向 \(B\),还要满足一些条件,条件在 DP 时,都可以简单记下,复杂度 \(O(n^5)\)。

5.Random Card Game

考虑怎么判定。

首先有 \(2n\) 的一边,肯定清空不了的,那就是清空另一边的最优策略。

我们假设 \(2n\) 在右侧。

需要的次数即为 \(n+\) 右边死掉的人,那我们目标就是最大化剩下的牌数。

现在相当于右边有 \(n\) 个人,需要打死左边的 \(n\) 个人需要的最少人数。

我们考虑一种最优策略肯定是,你从上往下考虑的时候,如果你可以打,那你就会一直打到一个你打不过的人,这时你就不和他打了,让下一个人去打,直到一个可以打过它的人,然后重复这个操作。

发现这个操作算出的值实际上就是左边点 \(i\) 如果能打死右边一个前缀 \(j\),那么答案即为 \(\max j-i\)。

一个人 \(i\) 只能打到当前 \(j>=i\) 的人,如果前面打了人的话,位置也会顺次位移上去,所以可以证明。

那考虑怎么对这个东西计算期望,我们可以把 \(E(x)\) 变为 \(\sum_{t=0}^{n-1} P(t<x)\)。

那我们就相当于要记对于任意 \(i\) 满足 \(\max_{j=1}^{i+t-1}B_i < A_i\) 的概率。这个可能还是不太好做
,那我们就钦定第一个不合法位置就可以,但是发现这里居然出现了 \(\max > x\) 这种东西,这是不好计数的,于是我们考虑反过来,记任意 \(i\) 满足 \(\max_{j=1}^{i+t-1}B_i > A_i\) 的概率,这样容斥完就变成了 \(\max < x\),这是好做的,我们相当于是有 \(2i+t-2\) 个数,要往里面插一个数使得这个数是最大值,有 \(2i+t-1\) 个空,概率显然是 \(1-\frac{1}{2i+t-1}\),最后乘起来就行了。

总结:这个最后一步钦定的处理是值得学习的。

6. Grid Coloring 3

第一步肯定要时光倒流的,之后是第一步是十字架,以后你放十字架时可以选一列放在第一次放的十字架上,这样就只会有行或列有贡献,十字架是可以用这个拼出来的,所以之后可以不考虑十字架了。

现在操作形如:

  • 第一次选择一行一列覆盖为一种颜色。
  • 之后每次选择一行或一列进行覆盖。

考虑对于一种最终局面找到一种唯一的回退方案。

设初始选择颜色为 \(c\)。

  • 首先为了防止一个图形中有多个十字架导致算重,我们考虑第一次直接把所有整行整列都是 \(c\) 的行列全部取出来。
  • 之后如果存在整行都是一个颜色或已经被涂色,那就把所有满足这个要求的行全部涂色。
  • 每次轮流操作行列,每次至少会涂一个。否则最终的局面无法生成。

考虑对于这个过程计数,之后有两种办法。

做法一:直接DP

首先对于第一次涂色,需要保证涂的行的颜色与初始十字架不同。

之后的话由于你第一次涂的色不是 \(c\),所以之后就算涂 \(c\) 也没有问题了。

但是现在还有问题就是你需要满足每次涂完一行后之后涂完列再涂行,我们把这称作时刻 \(t1,t2,t3\)。

你需要满足的是对于 \(t2\) 时刻若涂的颜色均为 \(p\),\(p\) 是任意一种颜色,那么需要满足的是 \(t3\) 时刻涂的任意行都不能是 \(p\),否则就和上面的第二条规则矛盾了,所以这里对不能涂的颜色同样有限制。

我们考虑记下 \(f_{i,j,0/1}\) 表示还有 \(i\) 行,\(j\) 列,对颜色是否有限制的方案数,转移时依照上述规则即可。

做法二:容斥

7.Pairing Points

首先这种问题想要不重复计数,同样需要钦定一种方向往下,这里不妨钦定一为根,钦定第一条边是什么。

在划出第一条边之后,圆被分成了两个区域,左侧可以向右侧连一些不相交的边,现在你会有若干左侧向右侧连出的边,在这些边划出的相邻两块区域会存在一段前缀向上连,一段后缀向下连,这种结构非常适合区间 DP。

我们考虑用一个三元组来描述一个区间的信息 \([l,r,i]\),对于一个区间 \([l,r]\),有一条从 \(i\) 引出的一条线将其分成两侧,我们现在可以进行的操作是,将这两侧左右各选一个点,将这两个点连边,将这两个点记作 \(j,k\),我们发现在剩下的圆弧 \((j,k)\) 中,必定是一段前缀 \(x\in[j,i)\) 在区间 \([l,x]\) 连边,一段后缀 \(y\in(i,k]\) 在区间 \([x,r]\) 侧连边,中间一段在内侧连边,有清晰的子结构我们可以开始区间 DP,直接做是 \(O(n^7)\),稍微优化一下 \(O(n^6)\)。

8.Prefix Median

一个找性质的题目。
先将 \(a\) 排序。
我们可以观察一个合法序列 \(b\) 的充要条件。

  • \(b_i \in [a_i,a_{n-i+1}]\),且 \(b\) 为 \(a\) 中元素。
  • 对于任意 \(i \in [1,n)\),不存在 \(j \lt i\) 使得 \(b_j \in (b_i,b_{i+1})\) 。

这两个条件都是显然必要的,充分的话还不太会证明。

考虑怎么对于这个结构计数。

我们考虑倒着 DP,这样就更容易刻画第二条限制。

这样的化第二条限制形如,不存在一个点使得他在后面的两个点之间的区间出现过,那我们发现每次能取的值就是我们可选值的一段前缀拼上一段后缀。

我们直接 DP,就是 \(O(n^4)\) 的,可以通过。

9.Yes or No

我们发现如果剩下的题目中答案为对的比答案为错的多,我们就会回答对,否则就会回答错。

那我们可以把题目转化成格路行走,每次从最右上角往左下角走,如果在当前在 \(y=x\) 这条直线右下方,那么往左权值加一,如果在直线左上角,那么往下权值加一,如果在 \(y=x\) 这条直线上,那么往下或者往左都是 \(\frac{1}{2}\) 的概率得分。

那么我们发现如果不考虑 \(y=x\) 这条线上的,你一定会得到 \(\max(n,m)\) 的得分,否则你直接枚举每一个 \(y=x\) 的位置,计算经过这个点的方案即可,复杂度 \(O(n)\)。

10.彩绘

首先我们存在一个 \(O(n^2)\) 的做法,对于一个目标桶,当他左边有 \(l\) 个桶,右边 \(r\) 个桶时,你去考虑他被合并了多少次,发现式子形如 \(f_{l,r} = \frac{l-1}{l+r} f_{l-1,r} +\frac{r-1}{l+r} f_{l,r-1} +\frac {\frac{1}{2}}{l+r} f_{l-1,r} +\frac {\frac{1}{2}}{l+r} f_{l,r-1}\),考虑每次合并的过程即可。

需要注意到最后答案其实是若干乘积式相加,两边实际上是独立的,每一步选左或选右只影响相对顺序而不影响乘积。

11.一般难度的推式子题

首先题意转化一下,变为一个长度为 \(2n-2\) 的括号序列,求最大左括号数之和。

然后把 \(x = \sum [i<=x]\)。

然后发现方案就是一个双线反射容斥直接做一下即可。

12.安全门

首先把左括号看作 \(1\),右括号看作 \(-1\)。

然后 \(n\) 为奇数显然无解,先判掉。

合法括号序列要求任意时刻都有前缀和大于等于 \(0\),且最后时刻和为 \(0\)。

我们也可以把任意时刻前缀和大于等于 \(0\) 换成前缀 \(\min_{i=1}^{x} S_i \geq 0\),且 \(\max_{i=x}^{n} S_n - S_i \leq 0\)。

那我们知道我们翻转区间若是 \([l,r]\),必然要满足对于 \(\min_{i=1}^{l-1} S_i \geq 0\),对于 \(\max_{i=r}^{n} S_n-S_i \leq 0\),显然满足第一个要求的位置是一个前缀,满足第二个的是一个后缀。

对于中间位置要求即为 \(\min_{i=l}^{r} S_{l-1} +(-(S_i-S_{l-1})) \geq 0\) 也是 \(\min_{i=l}^{r} 2S_{l-1} \geq S_i\)。

首先可以知道一个 \(O(n^2)\) 的判定,即你每次翻转做一遍上面判定即可。

但是这样干显然是计不了数的,你必须要可以钦定选一个左端点或是一个右端点使得选了这些点一定不劣才可以,不然你就可能计重或是计漏。

我们有性质当 \(l \leq r\) 时,选择的端点一定是前 \(l\) 个中的最大值,或是后面的最大值。

设前面最大值为 \(mxl\),后面最大值为 \(mxr\)。

考虑画出折线图。折线图

我们讨论一下:

当 \(mxl +\frac{S_n}{2} \leq mxr\) 时最优策略是选择 \(mxl\)。

我们选择 \(mxl\) 时,对于中间的限制肯定做到了尽可能满足。
若不满足中间限制直接无解,否则讨论一下:

  • 当 \(mxl \geq S_n\) 时,一定有解,因为注意到 \(S_{r-1} =S_n-1\) 所以,我们只要选择右侧第一个满足 \(S_i = mxl+\frac{S_n}{2}\) 的值,前面一定不可能存在比他大的位置。
  • 否则右边不可能存在对应的值,直接无解。

否则,我们会选择 \(mxr\)。

这样显然对于中间的限制依旧做到了尽可能满足。

我们继续讨论一下:
左侧可以取到值的区间为 \([0,mxl]\)。

  • 当 \(mxr-\frac{S_n}{2} \geq 0\) 时,一定有解,理由同上。
  • 否则无解。

那我们继续讨论一下 \(l>r\) 的情况。

注意到如果存在这种情况一定有 \(l=n\) 或 \(r=1\)。

  • 先讨论 \(l \neq n\)。
    因为 \(l>r\),所以显然有 \(S_{l} - S_n \leq 0\) 又有 \(S_l = 0\) 且 \(\min_{i=1}^{l} S_i \geq 0\),所以 \(\max_{i=1}^{l} S_i - S_{l} \leq 0\),那直接把两段拼起来就可以得到 \(\max_{i=1}^{n} S_i -S _n \leq 0\),所以有 \(r=1\)。
  • \(r \neq 1\) 证明同理。
  • 否则一定是一个合法括号序列。

我们考虑一下在这种情况下我们如何抉择。

还是考虑 \(r=1\) 情况,另一种类似。

我们断言我们一定选择 \(mxl\)。

考虑证明,首先依旧有如果选择 \(mxl\) 一定对于中间限制尽可能满足。

其次,在右侧一定对应有解,考虑如何证明,因为有 \(\min_{i=1}^{n}S_i \geq S_n\),又有 \(S_l =-1\),且由于 \(n\) 为偶数,所以 \(S_n \leq -2\),那右边取值范围就是 \([S_n,mxl -1]\),而 \(mxl+\frac{S_n}{2}\) 一定在这个区间内,所以可以取到。

于是我们成功有了一个非常简洁的 \(O(n)\) 的判定方法,考虑对其计数。

由于左右两边其实是对称的,为了方便实现,我们可以钦定左边取 \(mxl\),之后翻转一下再做一遍就可以,但是可能有两边都取等的情况,我们特殊处理一下就可以了。

现在考虑先考虑如何做 \(r=1\) 情况。

对于满足 \(l=n\) 的情况一定是合法括号序列,我们先直接算掉。

首先有一个朴素做法是枚举 \(mxl\) 的值,然后再枚举 \(S_n\),从右往左 DP 的同时要求 \(\max_{i=l}^{n} S_i \leq 2mxl\),再顺便把满足 \(S_r=mxl+\frac{S_n}{2}\) 的位置在第一次出现时记下来,之后你会限制不能再出现这个后缀和,否则就不是第一个了,最后枚举一个 \(l\),两边拼接即可做到 \(O(n^4)\)。

考虑怎么优化,先想一下左边与右边拼接的时候至少需要有哪些信息,首先 \(l\) 的位置和 \(mxl\) 肯定是不能少的,考虑怎么优化一下后面,我们知道如果你要描述后面,你至少要枚举一个到什么位置了,和为多少了,但是如果这样的话,再加上外层的两个枚举直接就完了。

我们需要思考,是否存在一种不需要知道 \(S_n\) 和 \(mxl\) 也可以描述我们限制的办法,我们考虑枚举 \(S_r-S_n\),之后直接倒着处理限制,然后再枚举 \(l\) 和 \(mxl\) 对两边进行合并。

第二个限制 \(S_r=mxl+\frac{S_n}{2}\) 是容易的,我们有了 \(S_r-S_n\) 和 \(mxl\) 后,可以直接解出来 \(S_r\) 和 \(S_n\),前面的限制看似不好处理,实际上我们发现 \(S_i \leq 2S_r -S_n\) 即为 \(S_i -S_n \leq 2S_r -2S_n\),发现我们只要每次记下后缀和就可以处理第一条的限制了。

中间的 DP 过程和前面的 \(O(n^4)\) 是基本相同的。

现在考虑做 \(l\leq r\) 的情况,发现和上面是基本相同的,唯一不同的是,可能出现一个位置使得 \(S_i -S_n\) 等于 \(-1\),倒着 DP 时,第一次出现这个的时刻就说明这个位置是前文中的 \(r\),就进行一次划分,具体而言考虑在之前的状态中是否出现 \(S_r\) 那一维再加入一条限制为是否出现 \(r\) 位置。后面还是有 \(S_i -S_n \leq 2S_r -2S_n\) 这个限制,但是没有不能出现 \(S_r=mxl+\frac{S_n}{2}\) 的限制了,这两次可以放在一起做。

接下来当 \(l\leq r\) 时可能出现 \(mxl+\frac{S_n}{2}=mxr\) 的情况,我们会多算一次,考虑在一次计算中把相等情况减掉即可,整体复杂度是 \(O(n^3)\)。

13.Dynamic Instability P

Sol

14.上升

首先你会发现这个题有点诡异,因为这个首先每个位置有一个值让你去算贡献乘积,那肯定就要绝对位置了,即必须从左往右扫描序列。

然后之后还给你了一些关键点的值,即给了你一些绝对大小。感觉上就不太可做。

但是注意到给了一个性质是关键点的值递增,我们想在这种情况下继续去维护相对大小,考虑怎么做,首先如果当前位置插入的值比现在给出值的最大值还大的话,我们可以直接维护大于给定值的相对大小,之后在给新的定值后再去决策。

但是对于小于最大定值的不太好做,我们无法再维护相对大小,因为可能存在把已经有绝对大小的值挤出他应有的位置。

我们考虑维护前面还存在的空位,每次插入值到空位中,之后比较只需比较插入的位置的前方空位数即可。

15.主旋律

这里要求的是生成子图为一个 SCC 的方案数。

我们考虑将一张图缩点后得到的是一个 DAG。那我们可以仿照 DAG 容斥的做法。

算一个图是 SCC 不好算,考虑算不是 SCC 的方案,这样就会有一个比较清晰的子结构,因为不是一个 SCC 的话,最外层必然存在一些一度点向一个任意图连边过程,这里可能算重,需要 DAG容斥,那就需要记下一度点点数,然后乘 \((-1)^{cnt+1}\) 的系数。但是如果把一度点点数记下来复杂度有点高,考虑在加点的时候直接乘上一个 \(-1\) 的容斥系数就行了。那我们只需要考虑算出一些一度点的方案数即可,我们考虑钦定一个加入集合顺序,可以选择按 \(lowbit\) 加入,这样不会算重。

之后只需要枚举子集,然后枚举一个点集随便选,然后再用一些一度点向他们连边即可,复杂度是 \(O(3^n n)\)。

16.机器人表演

首先你发现无论怎样钦定加入顺序都不太对,可能存在一种基于反悔贪心的做法。

那我们只能考虑最朴素的暴力是怎么干的,首先枚举一个串,然后判断是否合法,即判断串 \(S\) 与一个合法括号串归并是否可以合出 串 \(T\),有以下两种匹配方式:
设左括号为 \(1\),右括号为 \(-1\)。
设 \(f_{i,j}\) 表示 \(T\) 前 \(i\) 个与 \(S\) 前 \(j\) 个完成了匹配是否合法,设 \(a_i =\sum_{j=1}^{i} T_j\),\(b_i=\sum_{j=1}^{i} S_j\)。

  • 若 \(T_{i+1} = S_{j+1}\),有 \(f_{i+1,j+1}\) \(|=\) \(f_{i,j}\)。
  • 若 \(a_{i+1} \geq b_j\),有 \(f_{i+1,j}\) \(|=\) \(f_{i,j}\)。

若 $f_{n+2t,n} =1 $ 且 \(a_{n+2t} = b_n\) 则为合法。

那我们从前往后决策 串 \(T\) 的每个位置,把第二维的值状压下来就可以 $ 2^n n^2$。

有性质,我们可以直接维护有值的最高位 \(mx\),而不需要记录其他位置。

首先如果有如下情况都可以简单处理:

  • \(T_{i+1} =S_{mx+1}\)。
  • \(a_{i} \gt b_{mx}\)。
  • \(a_{i} = b_{mx}\) 且 \(T_{i+1} = -1\)。

否则,一定有 $a_i = b_{mx} $ 且 \(T_{i+1} =1\)。

我们断言找到前面第一个位置使得 \(b_x = b_{mx} - 1\) 一定为下一次匹配到的最优位置。

首先这是一组合法解,因为两个位置中间的位置一定是一个合法括号串,不然可以位置 \(x\) 一定在更后面。
其次肯定不存在优于这个解的解,因为如果再往后拓展必然有 \(b_{y} \gt b_x = b_{mx}-1= a_i\),不符合匹配规则。

所以我们直接做就可以 \(O(n^3)\) 了。

17.提问系统

首先,肯定要组合意义,变成选小球,然后你直接记录子树中的红色最长链和蓝色最长链就可以做到 \(O(n^3)\) 的复杂度。

考虑优化一下,一个想法是,我们直接钦定往上的路径上有 \(x\) 个红色,那么此时由于深度固定,所以蓝色个数就为 \(dep-x\) 个,那就只需要记录一个了,复杂度 \(O(n^2)\)。

posted @ 2026-08-30 17:14  lmy333  阅读(12)  评论(0)    收藏  举报