[FJOI2017]矩阵填数 (容斥原理)
题目传送门
现在看来熊猫杯的J题原来是个容斥套路题,按照值域排序后根据值域划分方块数,枚举子集容斥计算即可。
#include<cstdio>
#include<algorithm>
using namespace std;
const int p = 1e9 + 7;
const int N = 1100;
struct Matrix{
int x, y, x1, y1, v;
bool check() { return (x <= x1) && (y <= y1); }
int cal() { return (x1 - x + 1) * (y1 - y + 1); }
void read() { scanf("%d%d%d%d%d", &x, &y, &x1, &y1, &v); }
bool operator <(const Matrix &ret) { return v < ret.v; }
void operator |(const Matrix &ret){
x = max(x, ret.x), y = max(y, ret.y);
x1 = min(x1, ret.x1), y1 = min(y1, ret.y1);
}
}mat[15];
int h, w, n, m;
int s[N], u[N], num[N];
int qpow(int x, int k){
int ans = 1;
for(; k; k >>= 1){
if(k & 1) ans = 1LL * ans * x % p;
x = 1LL * x * x % p;
}
return ans;
}
void solve(){
scanf("%d%d%d%d", &h, &w, &m, &n);
for(int i = 1; i <= n; ++i) mat[i].read();
sort(mat + 1, mat + 1 + n);
// 求交集
for(int i = 1, up = 1 << n; i < up; ++i){
Matrix tt = {1, 1, h, w, 0};
for(int t = i, j = 1; t; t >>= 1, ++j){
if(t & 1) tt | mat[j];
}
if(tt.check()) s[i] = tt.cal();
}
// 求并集
for(int i = 1, up = 1 << n; i < up; ++i){
for(int t = i; t; t = (t - 1) & i){
if(num[t] & 1) u[i] += s[t];
else u[i] -= s[t];
}
}
// 划分值域容斥计算
// now是目前枚举的集合,pre是之前枚举过的集合
int now = 0, pre = 0, ans = 1;
for(int i = 1; i <= n; ++i){
now |= (1 << (i - 1));
if(mat[i].v == mat[i + 1].v) continue;
int res = u[now | pre] - u[pre];
int sum = qpow(mat[i].v, res);
for(int t = now; t; t = (t - 1) & now){
int tot = u[t | pre] - u[pre];
int del = 1LL * qpow(mat[i].v - 1, tot) * qpow(mat[i].v, res - tot) % p;
if(num[t] & 1) sum = (sum - del + p) % p;
else sum = (sum + del) % p;
}
ans = 1LL * ans * sum % p;
pre |= now;
now = 0;
}
printf("%d\n", 1LL * ans * qpow(m, h * w - u[(1 << n) - 1]) % p);
}
void clr(){
for(int i = 0; i < N; ++i) s[i] = u[i] = 0;
}
int main(){
int T;
scanf("%d", &T);
for(int i = 1; i < N; ++i) num[i] = num[i >> 1] + (i & 1);
while(T--){
solve();
clr();
}
}
[FJOI2017]矩阵填数 (容斥原理)的更多相关文章
- P3813 [FJOI2017]矩阵填数(组合数学)
P3813 [FJOI2017]矩阵填数 shadowice1984说:看到计数想容斥........ 这题中,我们把图分成若干块,每块的最大值域不同 蓝后根据乘法原理把每块的方案数(互不相干)相乘. ...
- [BZOJ5010][FJOI2017]矩阵填数(状压DP)
5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 90 Solved: 45[Submit][Status][ ...
- [FJOI2017]矩阵填数——容斥
参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...
- [luogu P3813] [FJOI2017] 矩阵填数 解题报告 (容斥原理)
题目链接: https://www.luogu.org/problemnew/show/P3813 题目: 给定一个 h*w的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w. ...
- bzoj5010: [Fjoi2017]矩阵填数
Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...
- bzoj 5010: [Fjoi2017]矩阵填数
Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...
- BZOJ5010 FJOI2017矩阵填数(容斥原理)
如果只考虑某个子矩阵的话,其最大值为v的方案数显然是vsize-(v-1)size.问题在于处理子矩阵间的交叉情况. 如果两个交叉的子矩阵所要求的最大值不同,可以直接把交叉部分划给所要求的最大值较小的 ...
- 【BZOJ】5010: [Fjoi2017]矩阵填数
[算法]离散化+容斥原理 [题意]给定大矩阵,可以每格都可以任意填1~m,给定n个子矩阵,要求满足子矩阵内的最大值为vi,求方案数. n<=10,h,w<=1w. [题解] 此题重点之一在 ...
- P3813 [FJOI2017]矩阵填数
传送门 矩阵很大,但是发现 $n$ 很小,从这边考虑,对于一个一堆小矩阵放在一起的情况 考虑把每一块单独考虑然后方案再乘起来 但是这些奇怪的东西很不好考虑 所以暴力一点,直接拆成一个个小块 但是这样我 ...
- [FJOI2017]矩阵填数
[Luogu3813] [LOJ2280] 写得很好的题解 \(1.\)离散化出每一块内部不互相影响的块 \(2.\)\(dp[i][j]\)为前 \(i\) 种重叠块其中有 \(j\) 这些状态的矩 ...
随机推荐
- gulp来处理html、css、js资源啦
gulp 一般用于处理自动化任务,默认情况无法处理模块化,也不会用于大型项目,但它可以使用各种插件来编译 html.css.js 等资源. 不清楚如何使用 gulp 开启任务的朋友可以参考 gulp使 ...
- 浏览器端模块化方式es module详解
在es module出现之前还有社区推出amd和cmd的规范,这两者还有其特定的编写方式,使用起来不算很方便.es module被官方推出来就成为了浏览器端实现模块化的一个很好的方案. 想要在浏览 ...
- 拖拽宫格vue-grid-layout详细应用及案例
目录 1.前言 2.安装 3.属性 4.事件 5.占位符样式修改 6.案例 1.前言 vue-grid-layout是一个适用于vue的拖拽栅格布局库,功能齐全,适用于拖拽+高度/宽度自由调节的布局需 ...
- 时序数据库 InfluxDB 第一篇 安装部署
使用场景: 最近项目上遇到大数据存储的问题,一个IOT融合项目,涉及到大量的工控监测数据存储.当前存储到关系库中的数据已经达到2亿条了.做了很多优化,查询还是很慢.便想着是否有更好的解决方案. 了解到 ...
- [nginx]编译安装openresty
前言 OpenResty是一个基于Nginx和Lua的高性能Web平台,其内部集成了大量精良的Lua库.第三方模块以及大多数的依赖项.用于方便地搭建能够处理超高并发.扩展性极高的动态 Web 应用.W ...
- 【译】ASP.NET Core在 .NET Core 3.1 Preview 1中的更新
.NET Core 3.1 Preview 1现在可用.此版本主要侧重于错误修复,但同时也包含一些新功能. 这是此版本的ASP.NET Core的新增功能: 对Razor components的部分类 ...
- 每日一题:如何判断是否是数组,一个既简单又复杂的问题。(不要再用Object.prototype.toString.call、instance of判断了!!!)
1.不要使用Object.prototype.toString.call() 正常情况下: const arr = [1,2,3,4,5] const obj = {} console.log(Obj ...
- FreeSWITCH容器化问题之rtp端口占用
操作系统 :CentOS 7.6_x64.debian 11 (bullseye,docker) FreeSWITCH版本 :1.10.9 Docker版本:23.0.6 FreeSWITCH容器化带 ...
- Python如何在日志中隐藏明文密码
Python如何在日志中隐藏明文密码 前言 在项目开发中,有的时候会遇到一些安全需求,用以提升程序整体的安全性,提高外来非法攻击的门槛,而在日志中隐藏明文密码打印便是最典型的安全需求之一. 在Pyth ...
- [ABC218F] Blocked Roads 题解
Blocked Roads 题目大意 给定一张 \(n\) 个点,\(m\) 条边的无向图,每条边的边权均为 \(1\).对于每一个 \(i\in [1,m]\) 求出从点 \(1\) 到 \(n\) ...