第46届ICPC东亚洲区域赛(昆明)补题题解 (B,F,E)

本文解析了第46届ICPC东亚洲区域赛的B-Blocks题目,通过预处理最终状态并利用二进制DP方法,计算染黑大矩形的期望操作次数。涉及矩形离散化、状态转移方程和经典状态概率求解。

第46届ICPC东亚洲区域赛(昆明)补题题解

第46届ICPC亚洲区域赛(昆明)(正式赛)
本博客是补题向题解,仅做记录方便自己理解。会参考大佬们的博客,所以代码会很像,会在题目前贴出参考的博客出处。

B-Blocks

本题参考知乎大佬cup-pyy的题解知乎 cup-pyy

题意

T T T组输入,给定一个大矩形,以左上角,右下角坐标 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x1,y1),(x2,y2) (x1,y1),(x2,y2)的形式给出 ( 0 , 0 ) , ( W , H ) (0,0),(W,H) (0,0),(W,H),以及 n n n个小矩形。一次操作会等概率的染黑任意一个小矩形(可能会重复染),问将大矩形染黑的操作次数的期望,如果无论如何也不能染黑输出 − 1 -1 1 T < = 500 , 1 < = n < = 10 T<=500 ,1<=n<=10 T<=500,1<=n<=10 ,矩形的坐标 0 < = x 1 , x 2 , y 1 , y 2 < = 1 e 9 0<=x1,x2,y1,y2<=1e9 0<=x1,x2,y1,y2<=1e9.

解析

对于求解期望我们需要解决一个问题,即最终态染黑大矩形可以由哪些小矩形染黑组成我们还是未知,对于本题的一个重点(如何预处理出最终状态)可以参考cup-pyy大佬的博客,对于处理的方式以及时间复杂度的分析优化已经讲解的很好,本人的代码也会有相应注释在这里就不赘述。
值得一提的是,在矩形范围很大,但矩形数量很小的情况下,离散化后将矩形分为一个个小方格再用bitset将二维的矩形压缩成一维来降低复杂度的方式真的很妙。
例如:

100
100
100
转化为bitset表示:100100100

我们详细讲解的是如何得到递推方程:
在预处理出哪些是最终态以后,我们可以用二进制数来代表这些状态,数的二进制位上为 1 1 1就代表该编号的矩形被染黑。因为只有 10 10 10个矩形,我们可以采用状态的DP的方式逆向递推求解(从最终态推到全空白的情况)。

定义 f [ i ] : f[i]: f[i]:从状态 i i i到达最终态的期望次数,(最终态的 f [ i ] = 0 f[i] = 0 f[i]=0)。
这里我们可以使用经典的设未知数求解的方法求解
设当前状态是 i i i,分为两种情况 1. 1. 1.下一次操作染黑编号为 j j j的矩形并不包括在状态 i i i中, 2. 2. 2.染黑编号为 k k k的矩形是已经在状态 i i i中染黑的矩形。
1. ∑ j = 1 n 1 n ( f [ i ∣ ( 1 ≪ j ) ] + 1 ) 1.\sum_{j=1}^{n}\frac{1}{n}(f[i \mid (1\ll j)] + 1) 1.j=1nn1(f[i(1j)]+1)( j j j i i i中没有的状态)
2. ∑ k = 1 n 1 n ( f [ i ] + 1 ) 2.\sum_{k=1}^{n}\frac{1}{n}(f[i ] + 1) 2.k=1nn1(f[i]+1)( k k k i i i中已有的状态)
于是有: f [ i ] = ∑ j = 1 n 1 n ( f [ i ∣ ( 1 ≪ j ) ] + 1 ) + ∑ k = 1 n 1 n ( f [ i ] + 1 ) f[i] = \sum_{j=1}^{n}\frac{1}{n}(f[i \mid (1\ll j)] + 1) + \sum_{k=1}^{n}\frac{1}{n}(f[i ] + 1) f[i]=j=1nn1(f[i(1j)]+1)+k=1nn1(f[i]+1)
因为我们是逆推的,最终态的 f [ i ] = 0 f[i] = 0 f[i]=0已知,所以上式中的未知数只有 f [ i ] f[i] f[i]求解即可。
递推到最后 f [ 0 ] f[0] f[0]就是答案。

代码

#include <bitset>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long
const int N = 500, mod = 998244353;
ll ksm(ll a,ll b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值