CodeForces Round #370 (div.2) 即 Codeforces 712

CodeForces Round #370 (div.2) Descreption


A

设A[i] = B[i] - B[i + 1] + B[i + 2] - B[i + 3]…
现在给出A序列,求B序列。

B

给出一个有上下左右四个方向的移动序列。你能任意改变这个序列,问能否用最少的修改次数使得最后回到起点。

C

给出一个边长为X的正三角形,每次操作可以修改一条边的长度,要求是边保持整数且始终能构成三角形,问最少多少次操作可以修改为一个边长为Y的正三角形。

D

A一开始有a分,B一开始有b分,游戏有t轮,每轮每个人的分数都会随机加上一个[-t, t]之间的整数,问有多少种不同的可能A最后会赢。(任意一轮任意一个人的得分不同的情况就是不同的)

E

给你N个点,当你到每个点时有P的概率向右走,否则往左走,现在要支持两个操作:

  1. 修改一个点的P
  2. 询问一个区间[L, R]以L为起点,走出R点的概率是多少(期间不能走出区间)

CodeForces Round #370 (div.2) Solution


A

从后往前递推即可。

B

若操作次数为奇数,则显然无解。
否则先分别把L和R、U和D的差补上,若LR的和为奇数则补一个给U和D。

C

倒过来操作,每次把最短边改为其他两边之和-1.

D

这种题目一眼就知道是DP了。我们只关心胜负,所以不用纪录具体的分数,只用纪录分数差即可。用DP[i][j]表示游戏进行到第i轮时分差为j的方案数。游戏一共有2t轮,每轮可能使分差加K或者-K,那么总状态数为O(t * t * K)级别,转移则是O(K)级别,那么总复杂度为O(t * t * K * K).
怎么优化呢?我们发现转移实际上是给一个区间都加上同一个数,那么我们运用差分,则可以将转移复杂度降为O(1),再用滚动数组优化空间。
最后时间复杂度O(t * t * K),空间复杂度(t * K).

E

概率什么的不是很会,很快就弃疗了,后面看的是网上大神的题解。(官方题解没看懂,感觉好辣鸡啊)

下面我翻译(转述)一下:

  • 假如我们有一个区间[1, N],设F[i]为当站在i点时从N点走出去的概率,G[i] = F[i] - F[i - 1], U[i] = (1 - P[i]) / P[i].
  • 则F[0] = 0, F[N + 1] = 1, F[i] = (1 - P[i]) * F[i - 1] + P[i] * F[i + 1].
  • 移项得F[i] - F[i - 1] = P[i] * (F[i + 1] - F[i - 1]), G[i] = P[i] * (G[i] + G[i + 1])
  • G[i + 1] = G[i] * U[i]. 又(G[1] + G[2] + … + G[N + 1]) = 1
  • G[1] * (1 + U[1] + U[1] * U[2] + … + U[1] * U[2] * … * U[N]) = 1
  • G[1] = F[1] = 1 / (1 + U[1] + U[1] * U[2] + … + U[1] * U[2] * … * U[N])
  • 那么我们只要维护A[L, R] = U[L] * U[L + 1] * … * U[R], B[L, R] = U[L] + U[L] * U[L + 1] + … + U[L] * U[L + 1] * … * U[R] 即可。
  • 显然A[L, R] = A[L, M] * A[M + 1, R], B[L, R] = B[L, M] + B[M + 1, R] * A[L, M].

使用线段树即可,复杂度O(N log N).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值