当前位置: 首页 > news >正文

题解:P3813 [FJOI2017] 矩阵填数

更差的阅读体验


注意到,一个矩阵最大值为 \(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.zskr.cn/news/48833.html

相关文章:

  • 25.11.13随笔联考总结
  • 完整教程:Verilog和FPGA的自学笔记6——计数器(D触发器同步+异步方案)
  • NOIP 考前做题计划
  • Docker部署Code-Server,实现远程写代码
  • 2025 年 11 月铁附件厂家最新推荐,聚焦资质、案例、售后的五家企业深度解读!
  • Day37(7)-F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project01\springboot-web-01
  • 深度学习实验一之图像特征提取和深度学习训练数据标注 - 实践
  • 题解:ABC232G Modulo Shortest Path
  • 如何在 Mac 上安装 MySQL 8.0.20.dmg(从下载到使用全流程,附安装包)
  • 基于Ai元人文构想的关系图
  • 题解:P10360 [PA 2024] Desant 3
  • 软件项目管理工具推荐|飞书项目 vs Asana vs ClickUp vs Jira
  • 题解:AT_abc232_g [ABC232G] Modulo Shortest Path
  • QF-Lib:用一个库搞定Python量化回测和策略开发
  • 软件工程学习日志2025.11.13
  • 完整教程:数值计算-线性方程组的迭代解法
  • 深入解析:三维旋转矩阵的左乘与右乘
  • HEVC视频扩展免费下载
  • 序列化概念及Jackson注解实现动态JSON响应
  • 2025热门学宠物美容师榜:黑龙江学宠物美容师/宠物美容师培训学校毛孩精致变美秘籍!
  • react-window API完全手册:参数、方法与事件全解析 - 指南
  • IOS抓包------Stream
  • 实用指南:数据库的事务和索引
  • 一键账户接管漏洞分析:XSS与CSRF链式攻击实战
  • Vue 3 完全指南:响应式原理、组合式 API 与实战优化 - 实践
  • 创建你的第一个Java文件
  • Imbalance
  • 2025 年 11 月展厅设计公司权威推荐榜:企业展厅、校史馆、博物馆、多媒体数字及VR线上虚拟展厅设计厂家精选
  • 易路AI人才罗盘:点亮组织内部的人才“星空”,让每一次人才决策都精准有据
  • (八大排序)基数排序