「2022/03」学习记录

主要是为了本地备份。另外这个月鸽了好多篇总结(?大问题)。很摸的一个月。

另外都是按照写总结的时间归类的(?),排序是按照本地名字排序排的。好耶。

「联合省选 2020 A | B」冰火战士

有冰和火两种战士。每个战士有一个温度 \(x_i\) 和一个能量 \(y_i\)

假设场地的温度是 \(k\),冰战士能上场当且仅当 \(x_i \le k\),火战士能上场当且仅当 \(x_i \ge k\)

接下来,你需要指定一个 \(k\),能上场的战士中,冰战士的能量和与火战士的能量和的两倍最小。

会给定 \(q\) 次询问,每次加入一个新战士或者删除一个之前加入的战士。

其中 \(1 \le q \le 2 \times 10^6,1 \le x \le 2 \times 10^9,\sum y_i \le 2 \times 10^9\)

不妨设 \(f(k)\) 表示温度为 \(k\) 时冰战士的能量和,\(g(k)\) 表示火战士的能量和。

显然 \(f(k)\) 是单调不降的,\(g(k)\) 是单调不升的。如果画出图就可以发现在 \(f\)\(g\) 交点前是 \(f\) 的图像,交点后是 \(g\) 的图像。

那我们求出交点就可以了。但答案是整点,所以选择最靠近答案的整点,即 \(g-f \ge 0\) 最大的 \(k\)\(f-g \ge 0\) 最小的 \(k\)

考虑二分答案,再用树状数组维护前后缀和即可。

但其实也可以不用二分,考虑用倍增。倍增的值直接树状数组。复杂度 \(\mathcal{O}(n \log n)\)

「联合省选 2020 A」作业题

给定一个无重边无自环的 \(n\) 个点 \(m\) 条边的图,定义一个生成树 \(T\) 的价值为:

\[val(T)=\left( \sum\limits_{i=1}^{n-1}w_{e_i} \right) \times \gcd(w_{e_1},w_{e_2},\dots,w_{e_{n-1}}) \]

其中 \(e_1,e_2,\dots,e_{n-1}\) 表示 \(T\) 包含边的编号。

求出所有 \(T\) 的价值之和并对 \(998244353\) 取膜。

其中 \(2 \le n \le 30,1 \le m \le \frac{n(n-1)}{2},1 \le w_i \le 152501\)

\(t=\gcd(w_{e_1},w_{e_2},\dots,w_{e_{n-1}})\) 。由欧拉反演 \(x=\sum\limits_{d|x} \varphi(d)\)

\[val(T) = \sum\limits_{i=1}^{n-1} w_{e_i} \times \sum\limits_{d|t} \varphi(d) \]

于是考虑计算答案时枚举 \(d\),然后保留 \(d|w_i\) 的边。

\[ans= \sum\limits_{d} \varphi(d) \sum_{T}\left( \sum\limits_{i=1}^{n-1}w_{e_i} \right) \]

接着考虑,只保留满足条件的边的图,的生成树的价值和。

注意矩阵树定理是计算树的权值积而不是和。那我们对一条边的贡献变形,变成 \((1+w_ix)\)

这样做乘法时,就是 \((a+bx) \cdot (c+dx)=(ac+(ad+bc)x)\),那么答案就是一次项系数。

写的时候还要写个加减乘除自定义运算啥的就行了。然后直接矩阵树定理。

「联合省选 2021」宝石

给定一个 \(n\) 个点的树,\(m\) 种宝石。第 \(i\) 个点售卖第 \(w_i\) 种宝石。收集器可以收集 \(m\) 个宝石,且必须按照 \(p_1,p_2,\dots,p_c\) 顺序收集,其中保证 \(p\) 互不相同。

\(q\) 次询问,每次询问一条路径 \(s \rightarrow t\),问最多可以收集到多少个宝石。

其中 \(n,q \le 2 \times 10^5, 1 \le c,m, \le 5 \times 10^4\)

首先通过一些处理把 \(p\) 变成一个连续的排列。

我们把一条路径 \(s \rightarrow t\) 拆成两段,设 \(x=\operatorname{lca}(s,t)\) 。于是有 \(s \rightarrow x\)\(x \rightarrow t\)

对于前一段,我们可以预处理出每个点到最近的 \(p_1\) 的位置。对于一个点 \(u\),如果从他开始跳,那么必须跳到点 \(v\) 满足 \(p_v = p_u+1\)。这部分可以用倍增处理。

但对于后一段,发现往下跳非常麻烦,于是考虑对这个路径倒着做 \(t \rightarrow x\),但这样就不知道起点是什么。考虑二分起点,然后 \(u\) 点就需要跳到点 \(v\) 满足 \(p_v=p_u-1\)。这也可以倍增处理。

于是剩下最后一个问题,如何找到 \(t\) 祖先第一个宝石是 \(mid\) 的点。

可以把询问全部离线,然后一起遍历的时候开一个桶,记录当前点的祖先的宝石的最近位置即可。

复杂度 \(\mathcal{O}(n \log^2n)\)

「联合省选 2021 A | B」滚榜

给定 \(n,m\)\(n\) 个数 \(a_i\)。问有多少种排列,满足 \(a_i+b_i\) 后是所有数的最大值,满足 \(b_i\) 不降且 \(\sum b_i =m\)

其中 \(1 \le n \le 13,1 \le m \le 500,0 \le a_i \le 10^4\)

首先注意到题目问的是多少种排列而不是 \(b_i\) 的分配。所以我们不妨对一个排列的 \(b_i\) 进行最优分配。

如果当前的 \(a_i > a_{i-1}\) ,那么设 \(b_i=b_{i-1}\);否则设 \(b_i=b_{i-1}+a_{i-1}-a_i\)。最后判断总和是否小于等于 \(m\) 即可。

我们把上面的式子变个形,\(\sum b_i=\sum \max(a_{i-1}-a_{i},0)(n-i+1)\)

考虑状压,设 \(f(s,i,k)\) 表示选了 \(s\) 状态的数,第 \(|s|\) 位是 \(i\),贡献了 \(k\) 的方案数。于是有

\[f(s,i,k) \leftarrow f(s,i,k)+f(t,j,k-g(j,i)\times(n-|s|)) \]

其中 \(t\) 表示相对 \(s\) 还没选的一位,\(g\) 表示贡献。

「联合省选 2021」矩阵游戏

有一个 \(n \times m\) 的矩阵 \(a_{i,j} (1 \le i \le n, 1\le j \le m)\),其每个元素为大小不超过 \(10^6\) 的非负整数。

根据该矩阵生成了一个 \((n-1) \times (m-1)\) 的矩阵 \(b_{i,j} (1 \le i \le n-1, 1 \le j \le m-1)\),每个元素的生成公式为

\[b_{i,j}=a_{i,j}+a_{i+1,j}+a_{i,j+1}+a_{i+1,j+1} \]

根据给出的矩阵 \(b_{i,j}\),还原出 \(a_{i,j}\)

考虑没有限制怎么做。想怎么怎么写(,于是会出现若干个数不满足 \(0 \le a_{i,j} \le 10^6\)

然后我们又发现,我们对行进行 \(+1\)\(-1\),结果是不变的。列也一样。

于是设行变了 \(c_i\),列变了 \(d_j\),于是有 \(0 \le a_{i,j} \pm c_i \pm d_j \le 10^6\)。对于同时 \(x-y\) 的形式可以用差分约束,而 \(x+y\) 不大行。

考虑对于偶数的 \(i\) 和奇数的 \(j\)\(c_i,d_j\) 取反。于是都是 \(x-y\) 形式了。差分约束即可。

「联合省选 2021 A | B」图函数

给定一个 \(n\) 个点 \(m\) 条边的的有向图 \(G\),定义 \(f(u,G)\) 表示有多少个 \(v\) 满足只走大于等于 \(v\) 的点有 \(u \rightarrow v\)\(v \rightarrow u\)

定义 \(h(G)=\sum\limits_{i=1}^n f(i,G)\)。定义 \(G_i\) 表示删掉第 \(1\)\(i\) 的边。

\(h(G)\) ,和对于所有 \(1 \le i \le m\)\(h(G_i)\)

其中 \(n \le 10^3,m \le 2 \times 10^5\)

注意到一个点对会对一个答案的前缀产生贡献,不妨设 \(u \rightarrow v,v \rightarrow u\) 经过的边编号最小值最大化为 \(x\)。也就是说他贡献了一个前缀,也就是一个差分数组,最后求答案可以取前缀和。

而这个差分数组可以用 Floyd 求出。

复杂度 \(\mathcal{O}(n^3+m)\)。可以通过本题(?

「联合省选 2021 A」支配

给定一张 \(n\) 个点 \(m\) 条边的有向图 \(G\),其顶点从 \(1\)\(n\) 编号。

对于任意两个点 \(u,v\),若从顶点 \(1\) 出发到达顶点 \(v\) 的所有路径都需要经过顶点 \(u\),则称顶点 \(u\) 支配顶点 \(v\)。特别地,每个顶点支配其自身。

对于任意一个点 \(v\),我们将图中支配顶点 \(v\) 的顶点集合称为 \(v\) 的受支配集 \(D_v\)

现在有 \(q\) 次互相独立的询问,每次询问给出一条有向边,请你回答在图 \(G\) 中加入该条边后,有多少个顶点的受支配集发生了变化。

其中 \(1 \le n \le 3 \times 10^3,1 \le q \le 2 \times 10^4\)

首先可以发现,支配具有传递性,如果 \(x\) 支配 \(y\)\(y\) 支配 \(z\) ,那么 \(y\) 支配 \(z\)。而如果 \(x,y\) 都支配 \(a\),如果 \(x,y\) 之间没有支配关系则意味着,如果删除 \(x\),则可以通过 \(y\) 走到 \(a\),那不满足定义。所以 \(x,y\) 之间会有支配关系.

对于一个点 \(x\),有且仅有存在一个点 \(y \in D_x\),满足 \(D_x\) 中其他的点都支配 \(y\)。所以我们把图建出一棵树,边为 \((x,fa_x=y)\) ,这就是支配树。这也意味着 \(D_x=D_y+1\)

加入一条边后,所有点的 \(D_x\) 只会变小或不变。由上面那些东西得,对于一个点 \(x\),要么他的 \(fa_x\) 不支配 \(x\),要么 \(fa_x\) 的支配集也会变。

所以只考虑加边 \((p,q)\)\(fa_x\) 不支配 \(x\),这意味着删除 \(fa_x\)\(1 \rightarrow p \rightarrow q \rightarrow x\)

注意这题数据范围不大,直接枚举然后暴力出每个点的支配集,建出支配树。然后枚举每个点删除其父亲后,哪些点仍然可以从 \(1\) 到达,哪些点可到达 \(x\) ,预处理出来。询问的时候直接判当前点和对其父亲的影响即可。

「八省联考 2018」劈配

考虑每次加入一个人会发生什么变化。如果当前最小的志愿里存在一名导师的学员没满,就选。如果满了,就看看目前在队伍里的人有没有可以换导师且换完每个人的志愿没有变。

发现这个类似二分图匹配的过程。

类似 STEAD - Steady Cow Assignment,对一个老师设一个 \(cnt\) 表示上限。

对于当前学员 \(x\),从小到大枚举他的支援 \(y\),如果当前存在一个老师 \(u\) 可以匹配就匹配,不能匹配就枚举他的学员看有无人可以替换。

对于第二问,显然答案可以二分。二分一个位置,先把这个位置前的匹配加入后,枚举能否匹配 \(b_x\) 前的志愿。

复杂度爆炸,我们发现前面的匹配是不会变的,考虑预处理出前缀 \(i\),表示前 \(i\) 个加入匹配时匹配的情况。

「六省联考 2017」摧毁“树状图”

如果我有罪请用法律制裁我而不是让我做这种小清新()树上 DP 。

这题你说他好吧但他实在是太丧心病狂了。

考虑设 \(f(u,0/1/2/3)\)

其中 \(f(u,0)\) 表示选择切一条,端点在 \(u\),另一端点在子树内的链的答案。

其中 \(f(u,1)\) 表示选择切一条,两个端点都在子树 \(u\) 内,且不经过 \(u\) 的答案。

其中 \(f(u,2)\) 表示选择切一条,两个端点都在子树 \(u\) 内,且经过 \(u\) 的答案。

其中 \(f(u,3)\) 表示选择切两条,一条端点在 \(u\),另一个端点在子树内;另一条两端点都在子树内。可以有点相交的答案。

分类讨论转移和计算答案。(不想写了。

「六省联考 2017」组合数问题

给定 \(n,p,k,r\),求

\[\left( \sum\limits_{i \ge 0} \dbinom{nk}{ik+r} \right) \bmod p \]

其中 \(1 \le n \le 10^9, 0 \le r < k \le 50,2 \le p \le 2^{30}-1\)

考虑这个式子的意义,给定 \(nk\) 个物品,从中选出 \(x\) 满足 \(x \equiv r \pmod k\) 的方案数。

\(f(i,j)\) 表示到第 \(i\) 个物品,选了 \(x \equiv j \pmod k\) 的方案数。

\[f(i,j)= \begin{cases} f(i-1,j)+f(i-1,j-1) & j \neq 0 \\f(i-1,k-1)+f(i-1,j) &j=0 \end{cases} \]

滚掉第一维。记下来考虑用矩阵乘法优化。

最后注意 \(k=1\) 的情况。

「CEOI2004」Sweets

John 得到了 \(n\) 罐糖果。不同的糖果罐,糖果的种类不同(即同一个糖果罐里的糖果种类是相同的,不同的糖果罐里的糖果的种类是不同的)。第 \(i\) 个糖果罐里有 \(m_i\) 个糖果。

John 决定吃掉一些糖果,他想吃掉至少 \(a\) 个糖果,但不超过 \(b\) 个。问题是 John 无法确定吃多少个糖果和每种糖果各吃几个。有多少种方法可以做这件事呢?

其中 \(1 \le n \le 10, 0 \le a,b \le 10^7, 0 \le m_i \le 10^6\)

生成函数的入门题。很适合我这种完全不会 GF 人(?)。说,谢谢 CEOI (。

首先,可以算限制为不超过 \(p\) 的方案数 。这样答案就是 \(b\) 的方案数减去 \(a-1\) 的方案数。

令系数表示拿的糖数,系数表示方案数。于是对于一个糖 \(i\),有:

\[f_i(x) = \sum\limits_{j=0}^{m_i}x^j = \dfrac{1-x^{m_i+1}}{1-x} \]

于是答案就是把每个糖卷起来,有:

\[f(x)=\dfrac{\prod\limits_{i=1}^n(1-x^{m_i+1})}{(1-x)^n} \]

因为 \(n\) 很小,所以上面的那个可以暴力拆式子。对于下面那个,用广义二项式定理拆开。

\[\begin{aligned} (1-x)^{-n} &= \sum\limits_{i \ge 0} \dbinom{-n}{i} \cdot (-x)^i \\ &= \sum\limits_{i \ge 0} \dfrac{(-n)(-n-1)\dots(-n-i-1)}{i!} (-x)^i \\ &= \sum\limits_{i \ge 0} \dbinom{n+i-1}{i} x^i \end{aligned} \]

于是答案为:

\[f(x)= \left( \prod\limits_{i=1}^n (1-x^{m_i+1}) \right) \sum\limits_{i \ge 0} \dbinom{n+i-1}{i}x^i \]

注意我们限制只到 \(p\),所以我们考虑对于拆后的每一项的对答案 \(ax^b\) 的贡献。

\[a \cdot \sum\limits^{p-b} \dbinom{n+i-1}{i} = a \cdot \dbinom{n+p-b}{p-b} \]

但本题的模数不是质数,计算组合数的时候需要用到扩展卢卡斯。但也可以用一个小技巧。

可以先把模数乘上除数,再将运算结果除以除数得到答案。

「CEOI2017」Mousetrap

有一个有 \(n\) 个房间和 \(n-1\) 条走廊的迷宫,保证任意两个房间可以通过走廊互相到达,换句话说,这个迷宫的结构是一棵树。

一个老鼠被放进了迷宫,迷宫的管理者决定和老鼠做个游戏。

一开始,有一个房间被放置了陷阱,老鼠出现在另一个房间。老鼠可以通过走廊到达别的房间,但是会弄脏它经过的走廊。老鼠不愿意通过脏的走廊。

每个时刻,管理者可以进行一次操作:堵住一条走廊使得老鼠不能通过,或者擦干净一条走廊使得老鼠可以通过。然后老鼠会通过一条干净的并且没被堵住的走廊到达另一个房间。只有在没有这样的走廊的情况下,老鼠才不会动。一开始所有走廊都是干净的。管理者不能疏通已经被堵住的走廊。

现在管理者希望通过尽量少的操作将老鼠赶到有陷阱的房间,而老鼠则希望管理者的操作数尽量多。请计算双方都采取最优策略的情况下管理者需要的操作数量。

注意:管理者可以选择在一些时刻不操作。

其中 \(1 \le n \le 10^6\)

不妨以陷阱的地方为根,这样变成了把老鼠赶到根节点。

假设管理者不做任何操作,那么最后老鼠一定会因为不走肮脏的地方而困死在一个叶子节点。那接下来考虑在老鼠被困的时候把其他子树都堵住,让擦完地板后老鼠只能沿着一条路一路向根节点。

这是最优的,如果我们不堵住,那么老鼠肯定会转身去另外一个子树,又被困住,除了要把这条路擦干净还要处理新子树内的其他情况。

于是老鼠能做的策略只有,向上走一些点,然后选一个子树走进去,最后被困叶节点。

先考虑预处理出选择某子树进入后需要的操作数。不妨设 \(f(i)\) 表示进入 \(i\) 子树后,再被赶回 \(i\) 的最小操作数。

假设目前计算到 \(u\) ,那么对于老鼠来说,肯定会选择 \(f(v)\) 最大的儿子节点 \(v\)。所以管理者在最优情况下选择堵住 \(f(v)\) 最大的那个点,那么老鼠只能选择 \(f(v)\) 次大的那个点。设 \(d(u)\) 表示一个点的度数,于是有

\[f(u) = f(v) +d(u)-1 \]

\(1\) 是因为父节点,而 \(v\) 满足 \(f(v)\) 次大。剩下的边要么是堵住的要么是回来的时候要擦干净的。

为了让老鼠尽量按照我们的预期走,我们希望老鼠到根的路径的支路封掉。所以也预处理出 \(cnt(u)\) 表示 \(u\) 往下走一步后需要封掉的上面路径的其他支路。于是有 \(cnt(u)=cnt(fa_u)+d(u)-2\)。减去到父亲的边和到子树的边。

所以 \(u \rightarrow v\) 的操作数是 \(f(v)+cnt(u)+1\),回头的时候要把 \(u \rightarrow v\) 擦干净。注意如果 \(u\) 是根节点需要 \(-1\)

接下来发现最小的答案仍然不好计算,考虑二分答案。

注意到老鼠会往上跳然后选子树,通过预处理的东西可以直接算出当前点的儿子的操作数。

但如果当前操作数大于我们二分的 \(x\),那么就不能走必须堵住这路。

不妨设堵了 \(s\) 条路,如果 \(s>x\) ,或者 \(s\) 比向上跳的次数的 \(+1\) 还大,即意味着老鼠比人更快到这个子树,就意味着这个答案不合法。

复杂度 \(\mathcal{O}(n \log n)\)

「PKUWC2018」随机游走

给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去。

\(q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一直随机游走,直到点集 \(S\) 中所有点都至少经过一次的话,期望游走几步。

特别地,点 \(x\)(即起点)视为一开始就被经过了一次。

答案对 \(998244353\) 取模。

其中 \(1 \le n \le 18,1 \le q \le 5000\)

一连补多个知识盲区。好耶!

问题等价于求当这个点集每个点都走过时,对于每个点的期望求个 \(\max\)

根据 \(\min - \max\) 容斥,在期望下仍然成立。放个链接 Min-Max容斥小记 给自己指路。

\[\max(S) = \sum\limits_{T \subseteq S} (-1)^{|T|+1} \min(T) \]

所以。只要求第一次走到这个集合时的期望就是 \(\min\)

接下来考虑对一个集合 \(S\),如何计算答案。记 \(d_u\) 表示点 \(u\) 的度数,\(fa_u\) 表示父亲,\(f(u)\) 表示从 \(u\) 出发的答案。

\[f(u)=\dfrac{1}{d_u} (f(fa_u)+\sum f_v ) + 1 \]

可以高消。但是枚举子集再高消似乎复杂度会寄。

考虑待定系数。希望他只从父亲转移来。这样就不用高消了。我们希望他是 \(f(u)=k_u f(fa_u)+b_u\)。于是

\[\begin{aligned} f(u) &= \dfrac{1}{d_u} (f(fa_u)+\sum f_v ) + 1 \\ f(u) &= \dfrac{1}{d_u} (f(fa_u)+\sum (k_vf(u) +b_v ) ) + 1 \\ d_u \cdot f(u) &= f(fa_u) + (\sum k_v) \cdot f(u) + \sum b_v + d_u \\ (d_u - \sum k_v) \cdot f(u) &= f(fa_u) + \sum b_v + d_u \\ f(u) &= \dfrac{1}{d_u-\sum k_v} f(fa_u) + \dfrac{\sum b_v + d_u}{d_u - \sum k_v} \end{aligned} \]

于是 \(k_u = \dfrac{1}{d_u-\sum k_v} , b_u = \dfrac{\sum b_v + d_u}{d_u - \sum k_v}\)。答案就是根节点的 \(b\)

所以枚举一个子集。可以 \(\mathcal{O}(n)\) 的算出这个子集的 \(f\)

考虑询问。如果枚举这个询问的集合的子集复杂度又寄了。

注意到一个子集的子集 \(T\) 的计算和 \(S\) 没有关系。所以考虑枚举 \(T\) 去贡献 \(S\)。考虑高维前缀和。指路 浅谈高维前缀和

「2020-02-28 省选模拟赛」小 B 的夏令营 (camp)

题目的连通。相当于存在一条被摧毁的路径,从第 \(n+1\)\(1\) 行。

考虑如何存下这些路径。为了不重复,每条路径都优先向下,再向左或向右。

于是设 \(f(i,j)\) 表示从 \(i-1\) 到这 \((i,j)\) 时,有向右。\(g(i,j)\) 表示有向左。\(h(i,j)\) 表示啥都无。

「2020-03-04 省选模拟赛」很简单 (c)

网络流。假设全部选 B ,于是建图建出来选 R 的情况,然后费用改成 \(w_r-w_b\) 就好了。

对于给定的路径 \(u \leftarrow v\),对于一条路径的颜色,把 \(s \rightarrow u,v \rightarrow t\),上下界强制为 \(1\),其中 \(u \leftarrow v\) 费用为这条路径的 \(r\) 费用减去 \(b\) 费用。

然后对于一条边的限制。连边 \(u \rightarrow fa_u\) ,上下界为 \(b\) 在这条边最多和最少的颜色数量。

这意味着如果,每条路径如果不选择 \(r\),就要经过 \(u \rightarrow fa_u\) 边,或者选择 \(r\),直接 \(v \rightarrow u\)

「2022-03-14 省选模拟赛」

矩阵基问题 (basis)

鸽。

非对称信息博弈问题 (war)

为了研学报告然后把题出到模拟赛里的 Linshey 是鉴。

首先肯定是能冲就冲。如果碰到了对手就和他干架(干架这里我赛时没写。

如果一个地方的位置是不可能被对方占领的,就先不冲,留着最后。走的时候尽量走中间的部分(参考样例 1)且离家里远的地方。

但可能写的比较劣,但又判的比较多。没有注意利用估价函数而是直接贪心乱判(?,应该学着加点随机化。

超市门口的游戏机 (marbles)

先令 \(p=\dfrac{p}{p+q},q=\dfrac{d}{p+d}\)

对于第一问,我们不妨先算 \(f(n,m)\) 的情况。枚举向左走了几步,于是有:

\[f(n,m) = q^m \sum\limits_{i=0}^n (n-i) \dbinom{m+i-1}{i} p^i \]

由广义二项式定理得

\[\begin{aligned} \dfrac{1}{(1-x)^m} &= \sum\limits_{i \ge 0} \dbinom{m+i-1}{i} x^i \\ \dfrac{x}{(1-x)^2} &= \sum\limits_{i \ge 0} \dbinom{i+1}{i} x^{i+1} =\sum\limits_{i \ge 0} ix^i \end{aligned} \]

于是设

\[\begin{aligned} g(m) &= q^m \dfrac{1}{(1-px)^m} \dfrac{x}{(1-x)^2} \\ &= q^m \sum\limits_{k \ge 0} \dbinom{m+k-1}{k} p^k [x^k] \sum\limits_{i \ge 0} i x^i \\ &= q^m \sum\limits_{d \ge 0} [x^d] \sum\limits_{k=0}^d \dbinom{m+k-1}{k} p^k (d-k) \end{aligned} \]

于是要求 \(f(n,m)\) 的就是 \(g(m)\) 的第 \(n\) 项。

注意到 \(m\) 固定,直接递推计算,每次计算 \(\dbinom{m+i-1}{i},i\dbinom{m+i-1}{i}\) 然后递推计算就可以了。

第二问。

\[\sum\limits_{i \ge 0} f(i,h) \times (p_2^i \times (1-p_2))= (1-p_2) \sum\limits_{i \ge 0} f(i,h) \cdot p_2^i \]

后面那个东西就相当于

\[q^h \sum\limits_{d \ge 0} [x^d] \sum\limits_{k=0}^d \dbinom{h+k-1}{k} p^k (d-k) \cdot p_2^d \]

考虑把 \(p_2\) 带入 \(x\),答案就是

\[(1-p_2^d) q^h \dfrac{1}{(1-p \cdot p_2)^h} \dfrac{p_2}{(1-p_2)^2} \]

第三问。同样,前提前。

\[(1-p_2) \cdot (1-q_2) \sum\limits_{i \ge 0}\sum\limits_{j \ge 0} f(i,j) \cdot p_2^i \cdot q_2^i \]

转化一下变成第二问。

\[(1-p_2) \cdot (1-q_2) \sum\limits_{m \ge 0} q^m q_2^m \dfrac{1}{(1-p \cdot p_2)^m} \dfrac{p_2}{(1-p_2)^2} \]

于是有

\[(1-p_2) \cdot (1-q_2) \cdot \dfrac{p_2}{(1-p_2)^2} \sum\limits_{m \ge 0} \left( \dfrac{q \cdot q_2}{1-p \cdot p_2} \right)^m \]

\(k=\dfrac{q\cdot q_2}{1-p \cdot p_2}\),于是又有

\[(1-p_2) \cdot (1-q_2) \cdot \dfrac{p_2}{(1-p_2)^2} \sum\limits_{m \ge 0} k^m \]

\[(1-p_2) \cdot (1-q_2) \cdot \dfrac{p_2}{(1-p_2)^2} \dfrac{1}{1-k} \]

「2022-03-16 省选模拟赛」

林间漫步 (wander)

首先注意到答案是可以二分的。那么考虑二分一个答案 \(mid\),问每条路径的费用是否都小于 \(mid\)

因为走的是树的遍历,那意味着一个子树必须走完才能出去。于是设 \(f(u,a,b)\) 表示当前子树是否能满足,从 \(u\) 出发到第一个叶子节点的路径长为 \(a\),最后一个叶子节点到 \(u\) 的路径长是 \(b\),且所有路径长度不大于 \(mid\)

注意到本题是二叉树。所以左右判断就可以了。于是有

\[f(u,a,b)=f(v_l,a,i) \& f(v_r,j,b) (i+j+w_l+w_r \le mid) \]

考虑优化 DP。考虑删掉一些状态。比如状态 \(f(u,a,b)\)\(f(u,c,d)\),且满足 \(a<c\)\(b<d\),那么后者就没用。

于是 \(f(u,a,b)\)\(a\) 排序,这样对于相邻两项,如果 \(b_i<b_{i+1}\),那么后者状态就用了。意味着 \(b\) 是递减的。

接着考虑转移部分。贪心的考虑,所以对于一个状态 \(f(v_l,a,b)\) 只需要找最小的 \(b_2\)\(f(v_r,a_2,b_2)\)

考虑用双指针合并。复杂度是 \(\log n\) 级别的。

于是总复杂度 \(\mathcal{O}(n \log n \log v)\)

序列划分 (divide)

首先显然有 DP ,设 \(f(i)\) 表示到 \(i\) 的答案。枚举一个后缀 \(j\),答案就是 \(j \sim i\) 的结果乘上 \(f(j)\) 的和。

注意到后缀的贡献是递减的,且如果当前为 \(x\),只有前面 \(\operatorname{mex}\)\(x\) 的才会更新。

所以每次维护答案为 \(\operatorname{mex}=z\) 的后缀和 \(z\) 最后出现的位置 \(ls\) 即可。于是每次只要求 \(ls\),维护 \(ls\) 不在第一个非负整数。

线段树二分即可。复杂度 \(\mathcal{O}(n \log n)\)

重排列 (permutation)

注意到不互质的数最后的相对位置不会改变。于是对于 \(\gcd(a_i,a_j) \neq 1 (i <j)\),考虑把 \(i \rightarrow j\),最后求出最大的拓扑序就好了。

但是注意 \(2,3,6\) 这种,如果 \(2 \rightarrow 6,3 \rightarrow 6\),结果是 \(3,2,6\),而显然 \(2,6,3\) 更优。所以考虑对每一个连通块,按照优先选最小值的顺序 dfs,相当于连边。

「2022-03-22 省选模拟赛」

小 F 与游戏 (game)

我们把最后的序列划分成 \(3\) 部分,\(1 \sim k-1,k,k+1 \sim n\)

对于第一部分,发现是结果一定两个单调序列并起来。而后半部分是在双端队列中是单调的。

所以后半部分意味着只要 \(k\) 取完了,前后就可以随意取。方案数 \(2^{n-k-1}\)

不妨设 \(f(i,j)\) 表示一个序列考虑了前 \(i\) 个数,已经填的最小值是 \(j\),假设第 \(i\) 个数是 \(x\)

则如果 \(x<j\),那么把他加到当前序列末尾,\(f(i,x)\leftarrow\sum\limits_{j=x+1}^n f(i-1,j)\)

否则,只能加在另一个序列,为了防止算重,定义为能放第一个序列就放第一个序列,否则再放这里。所以为 \(f(i,x)\leftarrow f(i-1,x)\)。注意当 \(i>n-x+1\) 的时候不合法。

做一个后缀优化,所以变成了 \(f(i,j)=f(i-1,j)+f(i,j+1)\)

发现这个东西长的很好看,发现把他折线一下就变成了组合数。变成了 \(\dbinom{n+m-2}{m-1} - \dbinom{n+m-2}{m-2}\)

两个乘起来就可以了。

小 Z 与函数 (function)

把程序拆开。分成 resvs

首先对于 res 来说,就是交换顺序对。所以对于一个位置 \(i\) 来说,他 res 的贡献就是对 \(1 \sim i-1\) 中比他小的数。

需要注意的是,相等的数不会再次交互,所以这里计算 res 需要去重。计算比他小的不重复的数的个数。

考虑 vs。他的实质意义就是,当前位置是否有进行过交换。显然,如果前面的数都比他小,作为后面所有数的开头。

考虑计算所有数再减去没有贡献的。

那意味着前面一个时间点后面的数会通过交换跑到前面来。这意味着,一个数在任意时刻操作后都不存在前面的一个数比他小,则他没有贡献。用 set 维护即可。

小 W 与骑士 (knight)

注意任何一个向量都可以拆成两个已知的不平行向量的和 \((xa_x+xb_x,ya_y+yb_y)\)

所以提出每一组障碍和起点终点的 \((x,y)\),注意要是整数才满足题意。

于是变成了向上或者右走 \(1\) ,不能经过那些障碍的经典问题。每个点的贡献为 \((-1)^k \prod \dbinom{x_i-x_{i-1}+y_i-y_{i-1}}{x_i-x_{i-1}}\)

不妨设 \(f(i)\) 表示恰好经过 \(i\) 个障碍的贡献。那么转移就是,枚举 \(j < i\),然后计算时候乘 \(-1\)

最后就是答案总数减去 \(\sum f(i)\)

如果是平行的两个向量。那就是一维问题,直接暴力转移即可。

注意判断答案的无穷性和无解性,感谢伟大的 hack 数据。

posted @ 2022-04-01 09:47  Rainy7  阅读(136)  评论(2编辑  收藏  举报