题解:P3813 [FJOI2017] 矩阵填数

news/2025/11/13 21:00:37/文章来源:https://www.cnblogs.com/dyc2022/p/19219550

更差的阅读体验


注意到,一个矩阵最大值为 \(x\) 的充要条件是:

  • 矩阵中的每一个元素 \(\le x\)
  • 矩阵中存在至少一个 \(x\)

仅考虑第一个条件是好做的。具体地,每一个格子存在一个取值的上限 \(mx_{i, j}\),也就是所有覆盖这个格子矩形的 \(v\) 的最小值。由于不同格子是独立的,所以答案就是

\[\prod_{i = 1}^{h}\prod_{j=1}^{w}mx_{i, j} \]

接下来加上第二个条件不好做,考虑把不符合条件的填数字方案给容斥掉。

由于 \(n\) 很小,我们钦定一个集合 \(S\) 内的矩形不符合第二个条件,别的矩形无所谓。那么我们就可以这么求这个 \(mx\),其中 \(\leftarrow\) 表示取最小值:

\[mx_{i, j} \leftarrow v_k(k \not \in S, (i, j) \in \operatorname{rectangle}_k) \]

\[mx_{i, j} \leftarrow v_k-1 (k \in S, (i, j) \in \operatorname{rectangle}_k) \]

第二个式子之所以要 \(-1\) 是因为我们希望每个格子都不取到上界。

\(f_S\) 为钦定集合 \(S\) 求出的答案,再假设 \(g_S\) 表示恰好只有集合 \(S\) 不满足条件所求出的答案。由定义,\(f_S\) 就是所有 \(S\) 的超集 \(T\)\(g_T\) 之和。

\[f_S = \sum_{S \sube T} g_T \]

子集反演。

\[g_T = \sum_{S \sube T} (-1)^{|T| - |S|}f_S \]

\[\operatorname{ans} = g_{\varnothing} = \sum_{T}(-1)^{|T|}f_{T} \]

然后这道题就做完了。注意到我们有用的行和列只有矩形的边所在的行和列,所以可以离散化一下,这样我们暴力进行一次矩形修改的复杂度可以做到 \(O(n^2)\),枚举子集再枚举矩形,复杂度为 \(O(2^n n^3)\)

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define N 41
#define MOD 1000000007
using namespace std;
int h,w,m,n,ans,bnx,bny,bx[N],by[N],l[N],r[N],u[N],d[N],val[N],mx[N][N];
int qpow(int x,int y=MOD-2)
{int ret=1;for(;y;x=x*x%MOD,y>>=1)if(y&1)ret=ret*x%MOD;return ret;
}
void lsh(int &bn,int *b,int lim,int *x,int *y)
{bn=0,b[++bn]=1,b[++bn]=lim+1;for(int i=0;i<n;i++)b[++bn]=x[i],b[++bn]=y[i]+1;sort(b+1,b+1+bn),bn=unique(b+1,b+1+bn)-b-1;for(int i=0;i<n;i++)x[i]=lower_bound(b+1,b+1+bn,x[i])-b;for(int i=0;i<n;i++)y[i]=lower_bound(b+1,b+1+bn,y[i]+1)-b-1;
}
void solve()
{scanf("%lld%lld%lld%lld",&h,&w,&m,&n),ans=0;for(int i=0;i<n;i++)scanf("%lld%lld%lld%lld%lld",&u[i],&l[i],&d[i],&r[i],&val[i]);lsh(bnx,bx,h,u,d),lsh(bny,by,w,l,r);for(int S=0;S<(1<<n);S++){int sum=1;for(int i=1;i<=bnx;i++)for(int j=1;j<=bny;j++)mx[i][j]=m;for(int i=0;i<n;i++)for(int j=u[i];j<=d[i];j++)for(int k=l[i];k<=r[i];k++)mx[j][k]=min(mx[j][k],val[i]-(S>>i&1));for(int i=1;i<bnx;i++)for(int j=1;j<bny;j++)sum*=qpow(mx[i][j],(bx[i+1]-bx[i])*(by[j+1]-by[j])),sum%=MOD;if(__builtin_popcountll(S)&1)ans+=MOD-sum;else ans+=sum; ans%=MOD;}printf("%lld\n",ans);
}
main()
{int T;scanf("%lld",&T);while(T--)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/964712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第三章博文

1.关于数学三角形这道题目,从图形来看,它拥有自上而下的的逻辑结构,根据观察,可以列出以下的递归方程式: 假设我们使用一个二维数组c的下半三角来存放整个数学三角形,用i来控制行(从1开始),用j来控制列,那么就…

Spring BeanPostProcessor接口

[[Spring IOC 源码学习总笔记]] BeanPostProcessor BeanPostProcessor是 Spring 框架提供的一个扩展点接口,它允许开发者在 Spring 容器完成 Bean 的实例化、依赖注入之后,在初始化阶段的前后“拦截”并自定义 Bean …

25.11.13随笔联考总结

考试 正常通读题面,发现 T1 是构造,T2 很神秘没啥想法,T3 是一个比较明显的 dp,T4 是 ds。思考了一下决定还是顺序开。做 T1,有好几次都给我一种做出来的错觉,但是到最后一直有几个位置不合法,怎么微调都不能构…

完整教程:Verilog和FPGA的自学笔记6——计数器(D触发器同步+异步方案)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

LucaOne架构

https://github1s.com/lucaone/LucaOne/blob/master/src/models/lucaone_gplm.py LucaOne模型架构详解 LucaOne是一个统一的基因-蛋白质多模态基础模型,其架构设计体现了对生物序列本质的深刻理解。模型的核心目标是打…

实用指南:Windows安装MongoDB保姆级教程(图文详解)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

linux USB --- 监听 USB 角色

#include <linux/device.h> #include <linux/module.h> #include <linux/mutex.h> #include <linux/gpio/consumer.h> #include <linux/platform_device.h> #include <linux/usb/typ…

温州工友自动包装设备有限公司:专注螺丝五金智能包装,助力企业降本增效

在温州乐清电器之都,有一家深耕螺丝五金自动化包装设备领域多年的企业 —— 温州工友自动包装设备有限公司。该公司技术研发始于 2007 年,经过多年积累与沉淀,于 2011 年正式注册成立,如今已发展成为集研发生产、销…

25.11.09

CF1935F 如果代价都能做到 1,那就再好不过了。 尝试一下,发现一个子树总有最小值 \(x\),那么连接 \((x,x-1)\) 看起来就做完了。 但是可能 \(x-1\) 被删了,这样就挂了,需要连 \((x,x-2)\)。 然后发现 \((x,x-2)\)…

NOI2025 游记

Day -? UNR。两场应该都认真打了。但是一题不会,打了六个暴力喜提 rk 130 Ag。事后看来这可能掉了 RP。 D2T1 订了一下午。我怎么一点不会数数。 Day -1 报到日。 徽章订了不少,但是我真的太社恐了。跟着 winston 去…

NOIP 考前做题计划

11月14号 复习蓝书上的 \(0x06\) 和 \(0x07\) 节,重新思考 \(0x08\) 内这两节的习题,并为代码写注释 11月15号 上午打洛谷模拟赛,晚上复习蓝书上 \(0x11\) 节,并做当节习题以及 \(0x18\) 节对应的习题 11月16号 复…

网络攻防实战 lab06 靶机 VulnHub hard-socnet2

地址发现 arp-scan -l得到地址为 10.0.2.8。 端口发现与服务版本探测 nmap -p- nmap -p22,80 -sC -sV

[豪の学习笔记] Spring框架学习碎碎念#5

主动获取Bean对象、Bean的作用域、第三方Bean管理跟学视频:黑马JavaWeb课程 Bean管理 获取Bean ​ 默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将b…

Docker部署Code-Server,实现远程写代码

Docker部署Code-Server,实现远你不需要在自己的电脑上安装任何复杂的工具,只需要一个浏览器,就可以开始 C、C++ 和 Python 的学习与开发。参考:使用 Docker 部署 VS Code in The Browser - 谱次 - 博客园 hub.dock…

2025 年 11 月电力金具厂家最新推荐,精准检测与稳定性能深度解析!

全球电力系统对核心部件稳定性的依赖度持续攀升,电力金具的质量与性能直接影响输电网络安全。本次 2025 年 11 月电力金具厂家推荐榜单,由国际电力设备检测协会(IPTA)联合全球三大电力工程机构共同发布,测评覆盖全…

2025 年 11 月铁附件厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读!

随着电力工程、光伏发电及基础设施建设领域的全球化推进,铁附件作为核心配套产品,其品质与供应效率对工程质量的影响愈发显著。为精准筛选优质铁附件厂家,本次推荐结合国际电力设备协会(IEPEA)2025 年第三季度测评…

LucaOne模型的词汇表系统

https://github1s.com/lucaone/LucaOne/blob/master/src/models/alphabet.py#L1-L205 通过定义词汇表,就能输入蛋白质或者DNA。 这段代码定义了 LucaOne模型的词汇表系统(Alphabet类),是模型处理不同生物分子序列的核…

v4l2用户侧使用流程

前言 v4l2的用户侧使用方法的简单demo,参考:media/v4l/v4l2grab.c 实际上,v4l2的用户侧有libv4l开源库。用户可以使用此开源库快速搭建其用户侧代码。 流程 int main() {// openfd = v4l2_open("/dev/video0&q…

2025 年终端数据安全软件公司推荐数篷科技(深圳)有限公司,数据安全领域的坚实力量

在数字化浪潮席卷全球的当下,数据已然成为企业的核心资产,其安全防护至关重要。随着 AI、云计算等新兴技术的广泛应用,数据安全面临着前所未有的挑战,如数据泄露、非法访问等风险日益加剧。在此背景下,一款可靠的…

Day37(7)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project01\springboot-web-01

HTTP状态码大全 https://cloud.tencent.com/developer/chapter/13553package com.itheima;import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.ResponseEntity; import org.springfra…