题意:

平面上有n(n≤10)n(n\leq 10)n(n≤10)个矩形,每个矩形给出左下角坐标和右上角坐标。每次操作可以随机选择一个,把这个矩形的区域涂黑。给出一个矩形,左下角是(0,0)(0,0)(0,0),右上角是(W,H)(W,H)(W,H),求把这个矩形完全涂黑的期望操作次数

Solution:

显然这是个期望dp,但涂黑的矩形我们再涂没贡献,于是考虑状压记录他,设dp[s]dp[s]dp[s]为涂黑的集合为sss时,期望把(0,0)(W,H)(0,0)(W,H)(0,0)(W,H)这个矩形完全涂黑的操作次数,期望dp,考虑事件,对于每个sss,抽取的事件有两种,第一种抽到没涂过的,第二种抽到涂过的,没涂过的又细分几种,那么转移方程为

dp[s]=popcount(s)ndp[s]+∑{i∣((s>>i−1)&1)==0}1ndp[s∣(1<<i−1)]+1dp[s]=\frac{popcount(s)}{n}dp[s]+\sum_{\{i|((s>>i-1)\&1)==0\}} \frac{1}{n}dp[s|(1<<i-1)]+1 dp[s]=npopcount(s)​dp[s]+{i∣((s>>i−1)&1)==0}∑​n1​dp[s∣(1<<i−1)]+1

移项化简就可以得到dp[s]的转移方程了

接下来就是初值的设置,如果集合sss足以涂黑,那么dp[s]=0dp[s]=0dp[s]=0,如何确定一个集合能否涂黑?

我一开始的想法其实是做容斥,求出面积交是不是(W+1)(H+1)(W+1)(H+1)(W+1)(H+1),但是这个容斥太难实现了。然后就是扫描线,感觉有点高射炮打蚊子,并且我已经忘记怎么写了。然后发现有种方法很妙,和容斥一样适合小规模数据,离散化+bitset暴力,直接用bitset模拟二维平面,然后检查是否完全覆盖,此时需要注意的是:不是对每个点打上标记,而是线段,否则会把这种情况判对

此时W=3,H=3W=3,H=3W=3,H=3,x∈[1,3],y∈[1,3]x\in[1,3],y\in[1,3]x∈[1,3],y∈[1,3]的所有点都被覆盖,但是仍有空缺,正确做法是记录以某个点为开头/结尾的线段是否被覆盖

// #include<bits/stdc++.h>
#include<iostream>
#include<queue>
#include<cstdio>
#include<bitset>
#include<cstring>
#include<algorithm>
using namespace std;using ll=long long;
const int N=200005,inf=0x3fffffff;
const long long INF=0x3f3f3f3f3f3f,mod=998244353;ll qpow(ll a,ll b)
{ll ret=1,base=a;while(b){if(b&1) ret=ret*base%mod;base=base*base%mod;b>>=1;}return ret;
}ll inv(ll x){return qpow(x,mod-2);}struct node
{int x,y;friend istream& operator>>(istream& o,node& x){scanf("%d%d",&x.x,&x.y);return o;}
}a[15][3];int n;
ll w,h,f[1<<10];
vector<int>valx,valy;
bitset<25>bits[25];void color(int x)
{// printf("x=[%d,%d],y=[%d,%d]\n",a[x][1].x,a[x][2].x,a[x][1].y,a[x][2].y);for(int i=a[x][1].x;i<a[x][2].x;i++)for(int j=a[x][1].y;j<a[x][2].y;j++) bits[i][j]=true;
}bool check(int s)
{for(int i=1;i<=w;i++) bits[i]=bits[24];for(int i=1;i<=n;i++)if((s>>i-1)&1) color(i);for(int i=1;i<w;i++)for(int j=1;j<h;j++)if(bits[i][j]==false) return false;return true;
}void work()
{scanf("%d%lld%lld",&n,&w,&h);valx.clear(); valy.clear();valx.push_back(0);valy.push_back(0);valx.push_back(w);valy.push_back(h);for(int i=1;i<=n;i++){cin>>a[i][1]>>a[i][2];for(int j=1;j<=2;j++){valx.push_back(a[i][j].x);valy.push_back(a[i][j].y);}}sort(valx.begin(),valx.end());sort(valy.begin(),valy.end());valx.erase(unique(valx.begin(),valx.end()),valx.end());valy.erase(unique(valy.begin(),valy.end()),valy.end());for(int i=1;i<=n;i++){for(int j=1;j<=2;j++){a[i][j].x=lower_bound(valx.begin(),valx.end(),a[i][j].x)-valx.begin()+1;a[i][j].y=lower_bound(valy.begin(),valy.end(),a[i][j].y)-valy.begin()+1;}}w=lower_bound(valx.begin(),valx.end(),w)-valx.begin()+1;h=lower_bound(valy.begin(),valy.end(),h)-valy.begin()+1;for(int s=0;s<(1<<n);s++) f[s]=1;for(int s=0;s<(1<<n);s++){if(f[s]==0) continue;if(check(s)){f[s]=0;for(int i=1;i<=n;i++){if((s>>i-1)&1) continue;f[s|(1<<i-1)]=0;}}}if(f[(1<<n)-1]){printf("-1\n");return;}ll invtmp=inv(n);for(int s=(1<<n)-2;s>=0;s--){if(f[s]==0) continue;ll cnt=__builtin_popcount(s);for(int j=1;j<=n;j++){if((s>>j-1)&1) continue;f[s]=(f[s]+invtmp*f[s|(1<<j-1)]%mod)%mod;}f[s]=f[s]*n%mod*inv(n-cnt)%mod;}printf("%lld\n",f[0]);
}int main()
{int t; cin>>t;while(t--) work();return 0;
}

2021昆明icpc B 状压+期望dp,一点几何模拟相关推荐

  1. 2021 ccpc 哈尔滨 G. Damaged Bicycle 状压 + 期望dp

    文章目录 题意: 思路: 传送门 题意: 你需要从111走到nnn,初始速度是ttt,某些地方有自行车,每个位置自行车有pip_ipi​的概率是坏掉的,如果自行车没坏可以骑上自行车,速度是rrr,可以 ...

  2. bzoj 1076 奖励关 状压+期望dp

    因为每次选择都是有后效性的,直接dp肯定不行,所以需要逆推. f[i][j]表示从第i次开始,初始状态为j的期望收益 #include<cstdio> #include<cstrin ...

  3. HDU 4336 Card Collector(状压 + 概率DP 期望)题解

    题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_ ...

  4. bzoj4565 [HAOI2016]字符合并 结论+状压+区间dp

    如果k==2的话就是记搜, 但这个题用记搜的思路的话是需要枚举k个断点的, 所以对于枚举断点,就很可能有优化,比如到一个断点,一个决策的最优值 于是考虑区间dp模型,相当于是插入一个数,然后看影响. ...

  5. BZOJ2246 SDOI2011 迷宫探险(状压+概率dp)

    题面太长了,贴起来好麻烦,走链接吧: P2489 [SDOI2011]迷宫探险 题目指向状压.自然地考虑用二进制表示状态,0为无害,1为有害.紧接着会发现,当我们走到某个点 ( x, y ) 时,我们 ...

  6. P2473 奖励关 状压概率DP求期望

    题目链接 https://www.luogu.com.cn/problem/P2473 题意 n轮,m种球,每轮随即一个球,可以接可以不接,接的话需要满足这个球的前置条件(比如3号球接球必须已经接过1 ...

  7. [BZOJ2246][SDOI2011]迷宫探险(状压概率DP)

    1.DP模型 用33进制数表示陷阱的状态,00表示无害,11表示有害,22表示未知.可建立DP模型: f[x][y][S][h]f[x][y][S][h]表示从(x,y)(x,y)开始,当前陷阱的状态 ...

  8. CF-1238E. Keyboard Purchase (状压dp)

    CF-1238E. Keyboard Purchase (状压dp) 题目链接 题意 长度nnn的字符串为排成一行,这个字符串由mmm个字符组成,你需要确定一种排列方式使得这个字符串的花费最少. 花费 ...

  9. 【CF1215E】Marbles【状压DP】

    传送门 题意:给一个长为NNN的序列aaa,每次操作交换两个相邻位置,求最少操作次数使得所有相同的值连成一片. N≤400000N \leq 400000N≤400000,ai≤20a_i \leq2 ...

  10. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

最新文章

  1. JPA学习(6)JPQL
  2. 近世代数--环同态--环同态基本定理
  3. Linux系统IO分析工具之iotop常用参数介绍
  4. VMware下Ubuntu无法全屏显示问题
  5. Android Flash分区大小查看
  6. php wmi,wmi与vbs
  7. 安装oracle需注意的地方
  8. 怎么用sql按条件把表分离_在做sqlserver数据库sql优化时,这25条事项需要注意
  9. ApiPost 测试工具
  10. java 日期 yyyy_Java时间格式化时YYYY(大写)和yyyy(小写)的区别
  11. 电路实习报告:简易收音机的焊接
  12. 互联网公司各岗位真实工作内容起底!运维又被扎心了。。。
  13. 文献笔记|Lau, 2021, Nature human behaviour
  14. SDR HDR 区别
  15. C语言多文件编译的精神内核-讲透多文件编译攻略
  16. win10卸载python3
  17. Spooling技术简单熟悉
  18. 气压传感器MPX4115学习笔记
  19. 基于高斯塞德尔方法的超松弛迭代法MATLAB实现
  20. 自然连接(NATURAL JOIN)

热门文章

  1. Xman的东西当然值钱了。每1单位高度的植物,就可以卖2美元,把减掉的植物都卖掉,就可以弥补罚单的损失了。你帮Xman计算一下一共可以卖多少钱。
  2. 损失函数 Loss、梯度 grad、参数 ω 和 学习率 lr 之间的关系
  3. 问题 A: 【动态规划】机器人军团(最大不下降子序列)
  4. JAVA核心基础笔记(上)
  5. CSS3 高级教程之动画定义和使用
  6. 在 Microsoft Visual Studio Team System 和 Microsoft Visual SourceSafe 之间选择
  7. 依托智慧警务 打造城市公共安全防控新模式
  8. 关于神舟笔记本电脑结束睡眠后耳机没声音的解决方法
  9. js禁止输入框输入特殊符号或emoji表情
  10. 魔兽争霸3冰封王座十大经典战役全集