题目传送门

现在看来熊猫杯的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. Git Cherry-pick使用

    概述 无论项目大小,当你和一群程序员一起工作时,处理多个 Git 分支之间的变更都会变得很困难.有时,与其把整个 Git 分支合并到另一个分支,不如选择并移动几个特定的提交.这个过程被称为 " ...

  2. Shiro配置类中的各个配置项浅谈

    背景: 上文中在落地实践时,对Shiro进行了相关的配置,并未对其含义作用进行详细学习,本章将进一步详解其作用含义. Shiro配置类中的各个配置项的作用: @Bean public Security ...

  3. Java 设计模式实战系列—单例模式

    本文首发公众号:小码A梦 单例模式是设计模式中最简单一个设计模式,该模式属于创建型模式,它提供了一种创建实例的最佳方式. 单例模式的定义也比较简单:一个类只能允许创建一个对象或者实例,那么这个类就是单 ...

  4. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛 矩阵快速幂)

    题目描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells ...

  5. 文盘Rust -- 生命周期问题引发的 static hashmap 锁

    2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了.项目地址:https://github.com/jiashiwen/interactc ...

  6. TDengine 用户案例合集 | 智能环保项目的时序数据处理难点与优化实践

    智能环保系统通常涉及大量的传感器和监测设备,以收集环境数据并对其进行分析和处理,这些数据通常是时序数据,即在一段时间内按时间顺序生成的数据,规模庞大且要求快速准确地进行分析和处理.也因此时序数据处理是 ...

  7. Teamcenter RAC 开发之《PlaceHolder》

    背景 做个swing表单,有时候想实现一些网页input标签的placeHolder提示,可能本人写vue or html写多,对某些细节有强迫症,所以找小下资料 实现方法(Swingx) 看源码

  8. 9.2 运用API实现线程同步

    Windows 线程同步是指多个线程一同访问共享资源时,为了避免资源的并发访问导致数据的不一致或程序崩溃等问题,需要对线程的访问进行协同和控制,以保证程序的正确性和稳定性.Windows提供了多种线程 ...

  9. open3d -- voxel_down_sample

    官网文档 parameter: Input: open3d.geometry.Pointcloud点云类 voxel_size: 体素单位长度 Return: 处理后的点云类 Description: ...

  10. Go语言常用标准库——context

    文章目录 为什么需要Context 基本示例 全局变量方式 通道方式 官方版的方案 Context初识 Context接口 Background()和TODO() With系列函数 WithCance ...