容斥 + 矩形面积并 + 状压dp

B-Blocks_第46届ICPC亚洲区域赛(昆明)(正式赛) (nowcoder.com)

题意

给出一个矩形A \((0,0),(W,H)\), 给出 \(n\;(1<=n<=10)\) 个矩形 \((x_1,y_1),(x_2,y_2)\) (坐标分别为左下角,右上角)

每次在这 n 个矩形中等概率选择 1 个,给这个区域涂色,求能将 A 区域完全涂满的期望次数

思路

  1. 看数据范围可知可能是状压dp,且因为是期望dp,倒推

  2. 设状态 \(s\) 为已经涂过色的区域,如 101 表示第 0,2 个区域被涂过了

    \(f[s]\) 表示从 \(s\) 开始,还要期望几次能涂满 A

    转移:枚举 \(s\) 中 0 的位置 i,并且记录共有 cnt 个

    ​ \(now+=f[s|2^i]\)

    ​ \(f[s]=\frac {1}n*now+\frac {n-cnt}n*f[s]\)

  3. 现在的问题是求出 dp 的起点,即有哪些状态是已经把 A 涂满的,记为 \(f[s]=0\)

    求若干矩形的面积并是否能覆盖 A,但并集不好处理,可以先求出 \(And[s]\) 表示 \(s\) 集合的面积交,用容斥求出面积并 \(Or[s]\)

    通过 \(And[s]\) 求 \(Or[s]\) 的过程可以枚举子集,\(O(3^n)\)

代码

#include <bits/stdc++.h>
using namespace std;
#define endl "\n" typedef long long ll;
typedef pair<int, int> PII;
const int N = 10;
const int mod = 998244353;
int n;
struct Node
{
ll x1, y1;
ll x2, y2;
}a[N]; ll inv[N];
ll f[1 << N];
ll And[1 << N], Or[1 << N];
ll H, W; ll qmi(ll a, ll b)
{
ll ans = 1;
while(b)
{
if (b & 1)
ans = ans * a % mod;
b >>= 1;
a = a * a % mod;
}
return ans % mod;
} void presolve()
{
for (int i = 1; i <= n; i++)
inv[i] = qmi(i, mod - 2);
for (int s = 0; s < 1 << n; s++)
{
ll X1 = 0, Y1 = 0, X2 = W, Y2 = H;
for (int i = 0; i < n; i++)
{
if (!(s >> i & 1))
continue;
auto [x1, y1, x2, y2] = a[i];
X1 = max(X1, x1), Y1 = max(Y1, y1);
X2 = min(X2, x2), Y2 = min(Y2, y2);
}
And[s] = max(0ll, X2 - X1) * max(0ll, Y2 - Y1);
}
for (int s = 0; s < 1 << n; s++)
{
Or[s] = 0;
for (int ns = s; ns; ns = (ns - 1) & s)
Or[s] += And[ns] * (__builtin_parity(ns) ? 1 : -1);
}
} void solve()
{
ll tot = H * W;
if (Or[(1 << n) - 1] < tot)
{
cout << -1 << endl;
return;
}
for (int s = (1 << n) - 1; s >= 0; s--)
{
if (Or[s] == tot)
{
f[s] = 0;
continue;
}
ll now = n, cnt = 0;
for (int i = 0; i < n; i++)
{
if (s >> i & 1)
continue;
now = (now + f[s | (1 << i)]) % mod;
cnt++;
}
f[s] = now * inv[cnt] % mod;
}
cout << f[0] << endl;
} int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T;
cin >> T;
while(T--)
{
cin >> n;
cin >> H >> W;
for (int i = 0; i < n; i++)
cin >> a[i].x1 >> a[i].y1 >> a[i].x2 >> a[i].y2;
presolve();
solve();
}
return 0;
}

2021昆明B的更多相关文章

  1. codevs 2021 中庸之道

    2021 中庸之道  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 给定一个长度为N的序列,有Q次询问,每次 ...

  2. Bzoj 1982: [Spoj 2021]Moving Pebbles 博弈论

    1982: [Spoj 2021]Moving Pebbles Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 130  Solved: 88[Submi ...

  3. poj 2021 Relative Relatives(暴力)

    题目链接:http://poj.org/problem?id=2021 思路分析:由于数据较小,采用O(N^2)的暴力算法,算出所有后代的年龄,再排序输出. 代码分析: #include <io ...

  4. 细谈昆明SEO市场

    就在前几天,以前的同事跟我说,现在昆明SEO市场真的是烂到不行,每家公司在招SEO这个方向的时候,给到的工资都很低,接着这几天闲来无事,就在某个招聘平台上注册了个账号,投了将近100份简历,专门去面试 ...

  5. iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)

    iPhone屏蔽IOS更新.iPhone系统更新的提示(免越狱,有效期更新至2021年) 1.在Safari浏览器中粘贴如下链接,按提示打开链接. 输入http://apt.dataage.pub 2 ...

  6. HDU 2021 发工资咯:)

    http://acm.hdu.edu.cn/showproblem.php?pid=2021 Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的 ...

  7. Math.abs(~2020) 按位取反后的绝对值是多少 2021, 按位取反后,比正数多1

    Math.abs(~2020)  按位取反后的绝对值是多少 2021, 按位取反后,比正数多1 int 值的取值 范围:   -128 ---  127   之间, 0000 0000     按位取 ...

  8. 部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930;

    描述:部分PR回写的数量带有小数,分别是2023工厂的纸箱104007000389,2021工厂的纸盒404002005930: 原因:所有物料规划PR时对舍入值的先后考虑逻辑影响到回写出来的temp ...

  9. codves 2021中庸之道

    2021 中庸之道 http://codevs.cn/problem/2021/ 题目描述 Description 给定一个长度为N的序列,有Q次询问,每次询问区间[L,R]的中位数. 数据保证序列中 ...

  10. HDU 2021 发工资咯:)(最水贪心)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2021 发工资咯:) Time Limit: 2000/1000 MS (Java/Others)    ...

随机推荐

  1. Redis的数据持久化

    介绍 Redis 的数据持久化方案 Redis 的数据持久化主要有两大机制,AOF 日志和 RDB 快照. AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态. RDB 持久化 ...

  2. python循环结构之while循环

    在python中,除了for循环,还有一个while循环 for循环:循环次数是明确了的 while循环:循环次数不确定,循环停止条件由用户自定义 # while语句结构 while 判断条件: 执行 ...

  3. Vuex从入门到精通

    一.vuex介绍 目标 什么是Vuex 为什么学习Vuex 通信方案 组件关系 数据通信 父子关系 父传子:props : 子传父:$emit 非父子关系 vuex (一种组件通信方案) Vuex是什 ...

  4. 基于 Traefik 的 ForwardAuth 配置

    前言 Traefik 是一个现代的 HTTP 反向代理和负载均衡器,使部署微服务变得容易. Traefik 可以与现有的多种基础设施组件(Docker.Swarm 模式.Kubernetes.Mara ...

  5. sniff()函数的总结

    作用: sniff()函数主要是用来捕获经过本机网卡的数据包 格式: sniff(filter="",iface="any",prn=function,coun ...

  6. 前端工程化筑基-Node/npm/babel/polyfill/webpack

    00.前端搬砖框架 开发 ⇨ 构建 ⇨ 部署上线 ⇨ 摸鱼: 01.Node.js/npm Node.JS 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境,不是JS库(是C ...

  7. Java正则表达式全局匹配

    今天想用Java的正则在字符串中匹配特定内容,但是当我代码写好运行后却发现正则表达式并没有起作用 试了很多方法,也去Js里试了正则表达式可以走通,就是Java不行 很纳闷 (:′⌒`) Java里正则 ...

  8. 基于AbstractProcessor扩展MapStruct自动生成实体映射工具类

    作者:京东物流 王北永 姚再毅 1 背景 日常开发过程中,尤其在 DDD 过程中,经常遇到 VO/MODEL/PO 等领域模型的相互转换.此时我们会一个字段一个字段进行 set|get 设置.要么使用 ...

  9. linux基础(部分讲解)

    linux常见岗位 Linux运维工程师.Linux高级架构师.运维开发工程师.数据库管理员.云计算架构师 作为python后端可以从事的linux岗位: 自动化运维.容器运维.DBA 注意:会的越多 ...

  10. SQL Case条件判断SQL

    问题描述:在表中取到一些值做出判断,配合监控监测一些表中的数据.使用select case when if 来做条件查询判断 CASE 表达式遍历条件并在满足第一个条件时返回一个值(类似于 if-th ...