bzoj5010: [Fjoi2017]矩阵填数
Description
Input
Output
#include<bits/stdc++.h>
typedef long long i64;
const int P=1e9+;
int T,h,w,m,n;
int xs[],ys[],xp,yp,vs[],vp,ts[];
int rc[][],mv[][],as[][];
void mins(int&a,int b){if(a>b)a=b;}
int pw(int a,int n){
int v=;
for(;n;n>>=,a=i64(a)*a%P)if(n&)v=i64(v)*a%P;
return v;
}
int main(){
for(scanf("%d",&T);T;--T){
int ans=;
scanf("%d%d%d%d",&h,&w,&m,&n);
xp=yp=vp=;
xs[xp++]=;
xs[xp++]=h+;
ys[yp++]=;
ys[yp++]=w+;
vs[vp++]=m;
for(int i=;i<n;++i){
for(int j=;j<;++j)scanf("%d",rc[i]+j);
xs[xp++]=rc[i][];
xs[xp++]=rc[i][]+;
ys[yp++]=rc[i][];
ys[yp++]=rc[i][]+;
vs[vp++]=rc[i][];
vs[vp++]=rc[i][]-;
}
std::sort(xs,xs+xp);
xp=std::unique(xs,xs+xp)-xs-;
std::sort(ys,ys+yp);
yp=std::unique(ys,ys+yp)-ys-;
std::sort(vs,vs+vp);
vp=std::unique(vs,vs+vp)-vs;
for(int i=;i<xp;++i)
for(int j=;j<yp;++j)as[i][j]=(xs[i+]-xs[i])*(ys[j+]-ys[j]);
for(int t=;t<n;++t){
rc[t][]=std::lower_bound(xs,xs+xp,rc[t][])-xs;
rc[t][]=std::lower_bound(xs,xs+xp,rc[t][]+)-xs;
rc[t][]=std::lower_bound(ys,ys+yp,rc[t][])-ys;
rc[t][]=std::lower_bound(ys,ys+yp,rc[t][]+)-ys;
rc[t][]=std::lower_bound(vs,vs+vp,rc[t][])-vs;
}
for(int S=;S<(<<n);++S){
for(int i=;i<xp;++i)
for(int j=;j<yp;++j)mv[i][j]=vp-;
int s=;
for(int t=;t<n;++t){
int v=rc[t][];
if(S>>t&)s=-s,--v;
for(int i=rc[t][];i<rc[t][];++i)
for(int j=rc[t][];j<rc[t][];++j)mins(mv[i][j],v);
}
for(int i=;i<vp;++i)ts[i]=;
for(int i=;i<xp;++i)
for(int j=;j<yp;++j)ts[mv[i][j]]+=as[i][j];
for(int i=;i<vp;++i)s=i64(s)*pw(vs[i],ts[i])%P;
ans=(ans+s)%P;
}
printf("%d\n",(ans+P)%P);
}
return ;
}
bzoj5010: [Fjoi2017]矩阵填数的更多相关文章
- [BZOJ5010][FJOI2017]矩阵填数(状压DP)
5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 90 Solved: 45[Submit][Status][ ...
- BZOJ5010 FJOI2017矩阵填数(容斥原理)
如果只考虑某个子矩阵的话,其最大值为v的方案数显然是vsize-(v-1)size.问题在于处理子矩阵间的交叉情况. 如果两个交叉的子矩阵所要求的最大值不同,可以直接把交叉部分划给所要求的最大值较小的 ...
- [FJOI2017]矩阵填数——容斥
参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...
- P3813 [FJOI2017]矩阵填数(组合数学)
P3813 [FJOI2017]矩阵填数 shadowice1984说:看到计数想容斥........ 这题中,我们把图分成若干块,每块的最大值域不同 蓝后根据乘法原理把每块的方案数(互不相干)相乘. ...
- bzoj 5010: [Fjoi2017]矩阵填数
Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...
- [luogu P3813] [FJOI2017] 矩阵填数 解题报告 (容斥原理)
题目链接: https://www.luogu.org/problemnew/show/P3813 题目: 给定一个 h*w的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w. ...
- P3813 [FJOI2017]矩阵填数
传送门 矩阵很大,但是发现 $n$ 很小,从这边考虑,对于一个一堆小矩阵放在一起的情况 考虑把每一块单独考虑然后方案再乘起来 但是这些奇怪的东西很不好考虑 所以暴力一点,直接拆成一个个小块 但是这样我 ...
- 【BZOJ】5010: [Fjoi2017]矩阵填数
[算法]离散化+容斥原理 [题意]给定大矩阵,可以每格都可以任意填1~m,给定n个子矩阵,要求满足子矩阵内的最大值为vi,求方案数. n<=10,h,w<=1w. [题解] 此题重点之一在 ...
- [FJOI2017]矩阵填数
[Luogu3813] [LOJ2280] 写得很好的题解 \(1.\)离散化出每一块内部不互相影响的块 \(2.\)\(dp[i][j]\)为前 \(i\) 种重叠块其中有 \(j\) 这些状态的矩 ...
随机推荐
- Sonar理论篇
一.Sonar是什么 Sonar是一个代码质量管理的开源平台,用于管理源代码的质量,通过插件形式,可以支持包括java.C#.JavaScript等二十余种编程语言的代码质量管理与检测. Son ...
- PHP黑魔法(该篇文章转自:http://www.91ri.org/12634.html 目的是作为自己的笔记方便查找)
那些年我们学过的PHP黑魔法 作者:Matrix_ling 序 这里必须得说一下==和===这俩货的重要性.==是比较运算,它不会去检查条件式的表达式的类型===是恒等,它会检查查表达式的值与类型是否 ...
- 如何安装psutil以及提示缺少python.h头文件
下载psutil 下载地址https://pypi.python.org/packages/57/93/47a2e3befaf194ccc3d05ffbcba2cdcdd22a231100ef7e4c ...
- linux之nagios安装教程
我的系统环境是centos7,其它系统应该也差不多,只是有几条命令可能需要换种写法 下面是我用到的命令 363 yum install -y gcc gcc-c++ httpd php php-gd ...
- KMPlayer速度步进设置及快捷键设置和同级视频自动加入播放列表
速度步进设置 快捷键设置 同级视频自动加入播放列表
- 围棋术语 & 中英文 。
https://senseis.xmp.net/?ChineseGoTerms 一字 二字 三字 四字 一字 长(nobi,solid extension),是指仅靠着自己的棋盘上已有棋子继续向前延伸 ...
- Linux 定时任务crontab使用
正好要搞一个定时删除数据的功能,想到linux 可设置定时器定时执行任务就学习了下~ 并不是所有的linux服务器上都装了crontab 像我这: [root@hehe local]# crontab ...
- 分享一篇 Git Web 开发流程
分享一篇 Git Web 开发流程 web 项目如何进行 git 多人协作开发 https://segmentfault.com/a/1190000018165757
- jmeter分布式测试的坑
转 : jmeter分布式测试的坑 有关jmeter分布式测试的环境配置,大概就是那样,但是每次想要进行jmeter分布式测试的时候,总是会有各种奇怪的问题,下面整理了一些可能遇到的坑. 只要错误中出 ...
- Pyhanlp自然语言处理中的新词识别
新词发现 本“新词发现”模块基于信息熵和互信息两种算法,可以在无语料的情况下提取一段长文本中的词语,并支持过滤掉系统中已存在的“旧词”,得到新词列表. 调用方法 静态方法 一句话静态调用接口已经封装到 ...