https://atcoder.jp/contests/abc271/tasks

G - Access Counter

给定 长24的C

如果 Ci==T, 甲 X % 可能访问

如果 Ci==A, 乙 Y % 可能访问

超过的C看作循环

好的状态 = 甲不是第N次方案的

求好的状态的 概率 mod 998244353

范围

n 1e18

x,y [1,99]

|c| == 24

2s

1024mb

我的思路

先最无脑的

dp[i][j] = 第i个被访问, 且是第j次 的概率

dp[i][j] = dp[k < i][j-1] * prod p[k+1..i-1] 不被访问 p[i]

ans = sum dp[i是乙][n]

然而是个无限的求和


要干掉无限

那么换个角度

dp[j][idx] 第j次访问, 位置在C[idx] 的概率

dp[j][idx] = dp[j-1][i=0..23] * p[i->idx] 从i开始下一次访问idx, 中间不访问其它的概率

这里把dp[j] 看成一个向量, p与j无关的常系数矩阵, 不就是矩阵快速幂了!


所以如何算p[pos0 -> pos1]

直接走到 = prod(1-p[pos0+1..pos1-1]) * p[pos1]

绕一圈走到 = prod(1-p[pos0+1..pos1-1]) * prod(1-p[...]) * p[pos1]

绕两圈走到 = prod(1-p[pos0+1..pos1-1]) * prod(1-p[...])^2 * p[pos1]

综上 = prod(1-p[pos0+1..pos1-1]) * p[pos1] * 1/(1-prod(1-p[...]))

问题来了, 如果分母为0 怎么办?

閱讀全文 »

https://atcoder.jp/contests/abc270/tasks

F - Transportation

n 个点

Xi 价格 点i 修 airport

Yi 价格 点i 修 harbor

Zi 修路 ui<->vi, m条

最小代价 所有点连通

范围

n 2e5

m 2e5

xi,yi,zi[1,1e9]

4s

1024mb

我的思路

如果没有airport/harbor, 那么就是 最小生成树

如果有

则会有两个点同时有 两种交通工具, 或者一个点同时三个交通工具

如果能确定基础代价, 那么增加连通代价 要么是路, 要么是某个交通工具

n这么大 也不能bitmask


如果只有一种

那么就是 先考虑所有都建立, 然后每次可以拆一个 贡献 -Xu + min(road[u,v?])

不会了

閱讀全文 »

https://atcoder.jp/contests/abc269/tasks

G - Reversible Cards 2

给定n张卡, 每张 正面ai,反面bi

初始都正面

问对于 k=0..m 的每个取值

让 可见面=k的最小翻转次数

所有 ai+bi 和为m, 所有ai,bi 在[0,m] 之间的整数

范围

n 2e5

m 2e5

3s

1024mb

我的思路

先想的是分治

f[i..j][v] 表示[i..j] 这一段 可见面=v的最小翻转次数

f[i..j][v] = min(f[i..mid][x]+f[mid+1..j][v-x])

似乎 需要min卷积 并不会


想过网络流, 但这里没有最大最小什么的, 唯一的最小就是最小次数, 但感觉网络流上 去等于k 看起来更像是费用和,


预处理, 先计算所有Ai的和, 然后翻转 看成 Bi-Ai 的增量

问题变成 有n个变量, 问和 = k-sum(A) 的最小选择个数

一股 spfa的感觉?

不会

閱讀全文 »

https://atcoder.jp/contests/abc268/tasks

G - Random Student ID

n个学生 姓名为小写字母,互不相同

问对于所有 a-z 的排列 决定的字典序下

每个学生 的 名字排名顺序期望

范围

名字长度和 5e5

3s

1024mb

我的思路

先估计一下n

1*26+2*26**2+3*26**3+4*26**3*7 = 546234 > 5e5

n < 26+26**2+26**3+26**3*7 = 141310

显然也不能两两计算


感觉可以 基数排序 先计算每个字符串, 的每一位所在的区间大小

而排序 可以看成 首位的期望偏移 + 第二位的期望偏移 + 第三位的期望偏移

可拆!

例如首位是a, 那么 a > b 则有b的长度贡献, a > c 则有c的长度贡献, 而和b与c的大小无关

1
abcde

a: (len(b)/2+len(c)/2+len(d)/2+…)

ab: a前缀中 空 + len(a)/2 + len(c)/2 + len(d)/2+…

abc: abc前缀中 空 + len(a)/2 + len(b)/2 + len(d)/2+…

其实就是 前缀中 : 空 + (all-len(cur))/2


注意 为前缀只是长度大小导致的不等关系

似乎就AC了

閱讀全文 »

https://atcoder.jp/contests/abc267/tasks

G - Increasing K Times

给一个长度为n的序列A

问有多少个 对它重排的方式 p, 满足 a_[p_i], 恰好有k个相邻严格递增

范围

n 5000

2s

1024mb

我的思路

首先A的顺序无关,不妨把a排个序

然后我们只要大于关系为k个,所以不妨设末尾为0

然后考虑把相同的值看成整体

考虑每次在上次运算的基础上, 计算增加了 多个 最大值

f[前i大][j个小于关系] = 方案数

f[i][j+k] = sum f[i-1][j] * count(前i-1个)-(j+1)选k个空隙,插入p个*j+1个缝隙 插入sz(i)-p个` * sz(i)!

binom(sumf(i-1)-(j+1),k) * binom(p-1,k-1) * binom(sz(i)-p-1,j)

1
2
3
k<=sumf(i-1)-(j+1)
k<=p
j<=sz(i)-p-1

这限制关系有点多变量也多, 虽然状态是满足, 但转移代价太大


另一个就是不要多个最大值去看, 而是一个一个加入

f[前i个][j个小于关系] = 方案数

发现 当第i个 > 第i-1个时, 插入 小于关系中, 不会影响j, 插入= 和 大于关系, 会增加1

f[i][j] = f[i-1][j] * j + f[i-1][j-1] * ((i-1)-(j-1))

当第i个=第i-1个时, 插入小于关系, 或=第i个的值的后面时, 不影响j, 设[0..i-1]中有sz个和第i个相等的

f[i][j] = f[i-1][j] * (j+sz(i)) + f[i-1][j-1] * ((i-1)-(j-1)-sz(i))

似乎就没了?

閱讀全文 »
0%