题目传送门

现在看来熊猫杯的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]矩阵填数 (容斥原理)的更多相关文章

  1. P3813 [FJOI2017]矩阵填数(组合数学)

    P3813 [FJOI2017]矩阵填数 shadowice1984说:看到计数想容斥........ 这题中,我们把图分成若干块,每块的最大值域不同 蓝后根据乘法原理把每块的方案数(互不相干)相乘. ...

  2. [BZOJ5010][FJOI2017]矩阵填数(状压DP)

    5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 45[Submit][Status][ ...

  3. [FJOI2017]矩阵填数——容斥

    参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...

  4. [luogu P3813] [FJOI2017] 矩阵填数 解题报告 (容斥原理)

    题目链接: https://www.luogu.org/problemnew/show/P3813 题目: 给定一个 h*w的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w. ...

  5. bzoj5010: [Fjoi2017]矩阵填数

    Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...

  6. bzoj 5010: [Fjoi2017]矩阵填数

    Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...

  7. BZOJ5010 FJOI2017矩阵填数(容斥原理)

    如果只考虑某个子矩阵的话,其最大值为v的方案数显然是vsize-(v-1)size.问题在于处理子矩阵间的交叉情况. 如果两个交叉的子矩阵所要求的最大值不同,可以直接把交叉部分划给所要求的最大值较小的 ...

  8. 【BZOJ】5010: [Fjoi2017]矩阵填数

    [算法]离散化+容斥原理 [题意]给定大矩阵,可以每格都可以任意填1~m,给定n个子矩阵,要求满足子矩阵内的最大值为vi,求方案数. n<=10,h,w<=1w. [题解] 此题重点之一在 ...

  9. P3813 [FJOI2017]矩阵填数

    传送门 矩阵很大,但是发现 $n$ 很小,从这边考虑,对于一个一堆小矩阵放在一起的情况 考虑把每一块单独考虑然后方案再乘起来 但是这些奇怪的东西很不好考虑 所以暴力一点,直接拆成一个个小块 但是这样我 ...

  10. [FJOI2017]矩阵填数

    [Luogu3813] [LOJ2280] 写得很好的题解 \(1.\)离散化出每一块内部不互相影响的块 \(2.\)\(dp[i][j]\)为前 \(i\) 种重叠块其中有 \(j\) 这些状态的矩 ...

随机推荐

  1. Windows查找监听端口对应的进程及其路径

    前言 假设扫描到1234端口存在可疑进程,需要找到该监听端口对应的进程及其进程文件的全路径,判断是否为可疑程序. 步骤 启动命令行:按win + r键,然后输入"cmd" 查看端口 ...

  2. 解决Avalonia 11.X版本的中文字体问题

    网上搜索的方法使用接口"IFontManagerImpl"这个方法目前只能用于Avalonia 10.X版本,因为11版本后官方把这个接口的成员都设置成了非plubic,所以之前的 ...

  3. Windows平台的JDK安装及IDEA配置JDK的过程

    1.下载安装包 jdk-8u201-windows-x64.exe,即jdk1.8.0_201 链接:https://pan.baidu.com/s/1WYaTlProtHkC_KyMHIUBxQ?p ...

  4. SNAT与DNAT原理及应用

    SNAT与DNAT原理及应用 当内部地址要访问公网上的服务时(如httpd访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网 ...

  5. 使用API接口获取商品数据

    ​ 在当今的数字化时代,商品数据的获取对于各种规模的企业来说都至关重要.这些数据可以帮助企业进行市场分析,制定销售策略,优化库存管理,以及实现精准营销.API(应用程序编程接口)是一种便捷的方式来获取 ...

  6. 一个 Java 接口快速开发框架:magic-api

    一.简介 magic-api是一个基于Java的接口快速开发框架,编写接口将通过magic-api提供的UI界面完成,自动映射为HTTP接口.无需定义Controller.Service.Dao.Ma ...

  7. hihocoder 1290 DP

    题目利用DP思想,dp[i][j][k]表示robot跑到i行j列目前移动方向为k时,所需要的最小的flip.其中0 <= i <= N,0 <= j <= M,k = rig ...

  8. WPF中的DesignerProperties

    在WPF开发过程中,最容易遇到的一个问题:就是在自定义控件的过程中写好业务逻辑后,在调用的地方,打开.xmal文件设计器时出现异常,经过排查发现是由于自定义控件初始化过程中需要进行赋值操作.为了能够让 ...

  9. Solution Set -「CF 1525」

    「CF 1525A」Potion-making Link. 显然. #include<bits/stdc++.h> typedef long long ll; template<ty ...

  10. Note -「virtual tree」shorter vrt

    Part. 1 Preface 没什么 preface. Part. 2 实现 具体来说就是把所有关键点按 \(\text{dfn}\) 排序,去重,然后求出相邻结点的 \(\text{LCA}\), ...