Atcoder abc216
G - 01Sequence
https://atcoder.jp/contests/abc216/tasks/abc216_g
代码
https://atcoder.jp/contests/abc216/submissions/33727628
1 |
|
H - Random Robots
数轴上k个机器人, 初始位置分别在xi
每次 每个机器人独立选择 移动(正向+1)或不动 1/2 概率
问经过N次,过程中没有任何两个robot 同时在同位置的概率
mod 998244353
限制
k [2,10]
n 1000
xi [0,1000], 严格单增提供
2s
1024mb
我的思路
一般来说 概率 = 次/总次数 可以互相转化
不相遇 可以 和相遇的容斥互相转化
k 10 的话可能和k的bitmask有关系
如果进行一次
而碰撞比不碰撞似乎好算一些
而且一般是相邻碰撞
pi 和pi+1 在t次时刻碰撞
意味着 t-1 次时距离1, t时 1/4 概率
0~t-1 时刻每次 1/4 +1, 1/4 -1, 1/2 不变
设原来距离 为d
那么 -1 次数 减去 +1 次数 = d-1, 且中间不能有负数情况
变成后缀个数统计问题
似乎可以强行算出t时刻 的概率, 实在组合排列不行, dp[时刻1000][距离2000]
来算也可以
那么无碰撞 = 所有 - 碰撞
所以想办法容斥掉碰撞
题解
用一下LGV引理相关的思路: 相交的路径 总有转化方法,成对的出现互为相反数的贡献,从而有相交的内容贡献和为0
每一个路径组方案贡献1 乘上-1的最终位置的逆序列数量次方, 其实就像当于LGV中所有边权为1 的特殊情况
$\sum_{Q} (-1)^{\sigma(Q)}\cdot(\frac{1}{2})^{NK}\cdot\prod_{i=1}^K {\rm C}(N,Q_i-x_i)$
也就是 方案 * (-1) 的幂次权, 再除以总方案数
Qi 为初始第i个机器人最终的下标
$\sigma(Q)$ 为逆序对个数
那么对于一条具体的有交的路径, 找其编号最小交点, 其中最小的起始位置,做后置路径交换(和LGV一样), 那么将得到一个新的路径组,有同样的交点,最小交点的最小起始位置依然相同, 但逆序对数变化为1, 所以总贡献为0
f[S][j] =
选起点集合在S中, 最终节点最大值 <= j 的 带权 方案数和
ans = f[{1,...,k}][x[k] + n]
考虑状态转移
最终最大节点 < j, f[S][j] += f[S][j-1]
最终最大节点 = j, f[S][j] += lgv中的行列式值 展开最后一列
所以有
$f(S, j) = f(S, j-1) + \sum_{i=1}^{|S|} (-1)^{|S|+i} e(x_{s_i}, j) f(S\setminus{s_i}, j-1).$
$f(S, j) = f(S, j-1) + \sum_{i=1}^{|S|} (-1)^{|S|+i} \binom{n}{j-x_{s_i}} f(S\setminus{s_i}, j-1).$
状态$2^k(n + x_k - x_1)$, 转移倍数$k$
总时间复杂度 $2^kk(n + x_k - x_1)$
注意到j仅依赖于j-1, 所以可以滚动数组降低空间
而S依赖于的都是S子集, 所以保证顺序即可
$for(j) \\ f(S) = f(S) + \sum_{i=1}^{|S|} (-1)^{|S|+i} \binom{n}{j-x_{s_i}} f(S\setminus{s_i}).$
注意到这里的i不是X数组的i而是X选出的x按照顺序组成的S中的i, 且是1-index
也可以表示成$d(S,i) = S$中比$i$大的的个数
$for(j) \\ f(S) = f(S) + \sum_{i=1}^{|S|} (-1)^{d(S,i)} \binom{n}{j-x_{s_i}} f(S\setminus{s_i}).$
代码
https://atcoder.jp/contests/abc216/submissions/33737388
1 |
|
总结
G
贪心完全不会
题解说有个cow game
有一些 dj-di <= wij 的限制
寻找最大的 dT-dS, 可以变成最短路问题
http://poj.org/problem?id=3169
H
学了一下LGV引理, 和其思路细节
路径不相交问题首选逆序对容斥,那么可以套用 LGV 引理
相关练习: https://www.luogu.com.cn/problem/P7736