题目传送门

现在看来熊猫杯的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. Linux:通过命令查找日志文件中的某字段

    工作中有用到,做个记录. 1. 查询某字段,显示行号: cat -n file_name|grep '查找字段' [root@ZWZF-CWY-LZY-12 CWY]# cat -n nohup.ou ...

  2. Linux下后台运行Java程序

    1.背景描述 用Java编写了一个程序(可执行的jar),需要在Linux中启动并持续运行 1.1.直接执行程序 直接执行程序后,在程序执行期间,无法在当前会话中再执行其他操作 1.2.直接执行程序后 ...

  3. 关于三维模型OSGB格式轻量化在数据存储的重要性浅析

    关于三维模型OSGB格式轻量化在数据存储的重要性浅析 三维模型的OSGB格式是一种常见的数据格式,用于存储和传输地理信息系统(GIS)中的三维地图数据.随着技术的不断发展,三维模型的应用越来越广泛,包 ...

  4. java与es8实战之四:SpringBoot应用中操作es8(无安全检查)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<java与es8实战>系 ...

  5. [apue] 进程环境那些事儿

    main 函数与进程终止 众所周知,main 函数为 unix like 系统上可执行文件的"入口",然而这个入口并不是指链接器设置的程序起始地址,后者通常是一个启动例程,它从内核 ...

  6. JSTL fn函数使用总结

    首先,我们要在页面的最上方引用: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/function ...

  7. strimzi实战之一:简介和准备

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于strimzi strimzi是一个开源项目,已加 ...

  8. 千呼万唤始出来 JDK 21 LTS, 久等了

    平地起惊雷!!! 目录 英雄的迟暮 大人时代变了 JDK 21 LTS 前 JAVA并发编程模型 JDK 21 LTS 中的 JAVA 并发编程模型 虚拟线程 VS 线程池 The Last 你可以称 ...

  9. Python socket实现简单聊天,同步输入和接收消息

    查的资料很多都是必须等待接收数据后才能再次输入.做了修改,使用多线程的形式,实现一边输入,一边接收 服务端代码 import socket import threading import sys im ...

  10. JS逆向实战23 某市wss URL加密+请求头+ws收发

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 本文首发链接为: http ...