dp复健
7/17
Valid Bitonic Permutations
题意:
构建一个以 \(k (2 \le k \le n-1)\) 为峰值的单峰序列 \(a\) ,使得在 \(i,j\) 位置上的数为 \(x,y\),问在模 \(10^{9}+7\)下有多少种序列。多测
\(t,n \le 100\)
设 \(x,y\) 为两个特定值的位置, \(nx,ny\) 为两个特定的值。
枚举峰值可能在哪里,设此时在 \(i\),同时因分讨 \(nx,ny\) 哪个较大。
$ nx > ny : $
$ \bullet i < x : \binom{n-nx-1}{x-i-1} \times \binom{nx-ny-1}{y-x-1} \times \binom{ny-1}{n-y}$
$ \bullet x < i < y : \binom{n-nx-1}{i-x-1} \times \binom{nx-ny-1}{y-i-1-((n-nx-1)-(i-x-1))} \times \binom{ny-1}{n-y}$
$ nx < ny : $
$ \bullet y < i : \binom{n-ny-1}{i-y-1} \times \binom{ny-nx-1}{y-x-1} \times \binom{nx-1}{x-1} $
$ \bullet x < i < y : \binom{n-ny-1}{y-i-1} \times \binom{ny-nx-1}{i-x-1-((n-ny-1)-(y-i-1))} \times \binom{nx-1}{x-1} $
然后特判一下两个值为 \(n\) 的情况以及两个值为 \(n\) 但是在首尾的情况即可。
Two Chess Pieces
题意:
给定一个 \(n\) 个点的树,一开始在根节点\(1\) 有一个黑棋和白棋,每次可以选择一个点移动一条边,给定黑点和白点分别一定要经过(没有顺序)的点,给定一个限制 \(k\) ,使得两个在任何时刻距离不能超过 \(k\),最后都要返回根节点,问最小操作数是多少。
\(n,k \le 2 \times 10^{5}\)
可以想到,每个棋最多经过一条边\(2\)次,那么我们把边下压到点上,判断对于黑棋和白棋,每个节点是佛需要经过。
要经过一个点,当且仅当两种情况:
1.在当前子树内,有相同颜色需要到达的点。
2.在当前子树内,两种颜色最深需要到达的节点深度差 $ > k-1$
那么用 $ dfs $ 查一下就行,没有一个需要经过的点 \(ans+=2\)。
Chain Chips
题意:
给定 \(n\) 个点有边权的链,每个点上初始有一辆车,可以将车移动,有 \(m\)次询问,每次修改一条边的边权并求最小的代价使得最后每辆车都不在初始点上且每个点上恰好有一辆车。
\(n,q \le 2 \times 10^{5}\)
\(a_{i} \le 10^{9}\)
对于一个区间,如果相互交换,对于每条边,可以做到被经过的次数少于等于两次,而不可能为一次(两边数量要相同),那么只有可能被经过两次或零次,那么我们可以将有没有被经过化为被不被选中,那么只要满足相邻两条边至少要选中一条(不然这个点就动不了了)即可,就变成了最小覆盖问题。
设$ f_{i0}\(为到当前边且当前边不选的最小值,\)f_{i1}$为到当前边且当前边选的最小值。可得转移方程:
\(f_{i,0}=f_{i-1,1}\)
\(f_{i,1}=min(f_{i-1,0},f_{i-1,1})+a[i]\)
而又有修改,想到动态 \(DP\) ,将转移方程变成\(\begin{bmatrix} \infty & a[i] \\ 0 & a[i] \end{bmatrix}\)在线段树上维护即可。
Roulette
题意:
小 \(A\) 在进行赌博,一开始他有 \(n\)块钱,第 \(i\) 局小 \(A\) 先投注 \(a_{i}\) 块钱,如果他赢了就拿回 \(2\times a_{i}\) 块钱,输了就拿不回来,每次赢的几率为 $\frac{1}{2} $。
\(a_{1}=1\) ,如果第 \(i-1\) 局赢了,那么 \(a_{i}=1\) ,如果第 \(i-1\) 局输了,那么 \(a_{i}=2 \times a_{i-1}\)。当小A赚了 \(m\)块钱或他付不起\(a_{i}\),那么小\(A\)收手。问在模 \(998244353\) 下他赚了 \(m\)块钱的概率。
\(n,m \le 10^{9}\)
可以想到,他下注的钱数为$ 2^{0} + 2^{1} + 2^{2} + 2^{3} + 2^{4} ... $,如果在他下注\(2^{i}\)块钱时,他会得到\(2^{i+1}\)块钱,那么与初始相比,他一共赚了 \(1\)块钱,也就是说,我们可以将这么输输输输输输输赢的一个步骤为一轮,一轮有 \(i\) 个回合,也就是说一共有 \(m\) 轮,我们要求经过 \(m\) 轮后他还没死的概率。
对于一轮,我们可以正难则反,求他这一轮的 \(i\) 个回合全部输的概率,用\(1\) 减去这个数就是这一轮赢得一块钱的概率,那么我们只要将所有轮赢得一块钱而不中道崩殂的概率乘起来就行。
然而 \(m \le 10^{9}\),但是我们发现,当一轮的回合数相同时,赢的概率都为 \(1 - \frac{1}{2^{i}}\),那么我们只要对 \((2^{i}-1,2^{i+1}-1]\) 分块求值就行,时间为 \(log(m)\)。注意收尾的区间。
7/18
Omsk Metro (hard version)
题意:
初始有一个点 \(1\) ,每次有两种操作,操作一加一个点权为 \(y (y \in \left \{ -1,1 \right \} )\) 点连在 \(x\) 下面,操作二询问在 \(x,y\) 的路径组成的 \(01\) 串中是否有子串和为 \(k\) 。多测
$ t \le 10^{4}$
$ n \le 2 \times 10^{5}$
先观察在序列上的问题,由于点权只有两种且为 \(1,-1\) ,所以只要求出最大子段和和最小子段和,那么最大子段和在移动左右端点使其成为最小子段和的过程中,必定将这两个数中间的数都遍历到(因为移动一次只加减 \(1\) ),所以我们只需要求出链上最大子段和和最小子段和,那么就变成了一个求子段和极值的经典问题。
求子段和极值在序列上一般可以用线段树(实际上是个维护一个区间 \(dp\) ),但是要注意这个转移合并是有左右之分的,所以要分为向上到 \(lca\) 和从 \(lca\) 向下两种情况,树剖也行,但我们可以用[CSP-S 2022] 数据传输的方法用倍增维护区间就行。
Railguns
题意:
一个 \(n \times m\) 的网格图,现在要从 \(\left ( 0,0\right )\) 走到 \(\left ( n,m\right )\) ,只能向下向右走或不走,其中某些时刻某些行和列会有激光,共有 \(k\) 束激光,问不被激光打到的情况到达 \(\left ( n,m\right )\) 的最小时刻。多测
\(T \le 10^{4}\)
\(n \times m \le 10^{4}\)
\(k \le 100\)
可以想到,答案的上界为 \(n+m+k\) ,为每一束激光都阻挡前进,那么我们设 \(f_{i,j,t}\) 表示在时刻 \(t\) 的时候到达 \(\left ( i,j \right )\) 的最小步数,那么我们暴力转移就是 $ O \left ( n^{2} m^{2} \right )$,然而我们发现,时间 \(t\) 其实就是 \(i+j+l \left ( l为躲避的激光数 \right )\),所以我们设\(f_{i,j,l}\) 表示在时刻 \(i+j+l\) 的时候到达 \(\left ( i,j \right )\) 的最小步数,那么暴力转移就行。

浙公网安备 33010602011771号