[FJOI2017]矩阵填数
\(1.\)离散化出每一块内部不互相影响的块
\(2.\)\(dp[i][j]\)为前 \(i\) 种重叠块其中有 \(j\) 这些状态的矩阵的最大值被满足了的方案数 , 这样转移就之和这个块有关了 , 直接计算取最大值和不取的方案数即可
则当取最大值时,把对应方案数转移到 \(dp[i + 1][j | s[i + 1]]\),否则转移到 \(dp[i + 1][j]\)
故 \(dp[Bcnt][(1 << n) - 1]\)为最终的方案
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
#define y1 Y1
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){
register LL x=0,f=1;register char c=getchar();
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();
return f*x;
}
const int N=10005;
const int M=31;
const int mod=1e9+7;
int x1[M],x2[M],y1[M],y2[M],val[M];
int x[M],y[M],block[M*M],st[M*M],f[M*M][1100],blimit[M*M];
int n,m,Val,K,Xcnt,Ycnt,Bcnt;
namespace Math{
inline int add(int x,int y){x+=y;return x>=mod?x-mod:x;}
inline int dec(int x,int y){x-=y;return x<0?x+mod:x;}
inline int mul(LL x,int y){x*=y;return x>=mod?x%mod:x;}
inline int qpow(int a,int b){
int res=1;
while(b){
if(b&1) res=mul(res,a);
a=mul(a,a);
b>>=1;
}
return res;
}
}using namespace Math;
inline bool in(int x,int y,int i){
return x>=x1[i]&&x<=x2[i]&&y>=y1[i]&&y<=y2[i];//判断(x,y)是否在i这个矩形里面
}
inline void init(){
memset(f,0,sizeof f);
memset(st,0,sizeof st);
x[Xcnt=0]=0;
y[Ycnt=0]=0;
Bcnt=0;
}
inline int solve(){
n=read(),m=read(),Val=read(),K=read();
x[++Xcnt]=0;//一定要记得放一个0!!!
y[++Ycnt]=0;
for(int i=1;i<=K;i++){
x1[i]=read(),y1[i]=read(),x2[i]=read(),y2[i]=read(),val[i]=read();
x[++Xcnt]=x1[i]-1;
x[++Xcnt]=x2[i];
y[++Ycnt]=y1[i]-1;
y[++Ycnt]=y2[i];
}
x[++Xcnt]=n;
y[++Ycnt]=m;
sort(x+1,x+Xcnt+1);
sort(y+1,y+Ycnt+1);
Xcnt=unique(x+1,x+Xcnt+1)-x-1;
Ycnt=unique(y+1,y+Ycnt+1)-y-1;
for(int i=2;i<=Xcnt;i++)
for(int j=2;j<=Ycnt;j++){
block[++Bcnt]=(x[i]-x[i-1])*(y[j]-y[j-1]);
blimit[Bcnt]=Val;
for(int k=1;k<=K;k++){
if(in(x[i],y[j],k)) blimit[Bcnt]=min(blimit[Bcnt],val[k]);//首先用最小的来约束它
}
for(int k=1;k<=K;k++){
if(in(x[i],y[j],k)&&blimit[Bcnt]==val[k]) st[Bcnt]^=1<<(k-1);//初始化,统计出已经满足了哪些要求
}
}
f[0][0]=1;
for(int i=1;i<=Bcnt;i++){
//由于是这样一块一块转移,每次只需要考虑这一块里面的
int ful=st[i];
LL fail=qpow(blimit[i]-1,block[i]);
LL success=dec(qpow(blimit[i],block[i]),fail);//这一块取到最大值的方案
for(int j=0;j<(1<<K);j++){
f[i][j]=add(f[i][j],mul(f[i-1][j],fail));
f[i][j|ful]=add(f[i][j|ful],mul(f[i-1][j],success));
}
}
return f[Bcnt][(1<<K)-1];
}
int main(){
for(int i=read();i;i--) init(),printf("%d\n",solve());
}
[FJOI2017]矩阵填数的更多相关文章
- [FJOI2017]矩阵填数——容斥
参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...
- P3813 [FJOI2017]矩阵填数(组合数学)
P3813 [FJOI2017]矩阵填数 shadowice1984说:看到计数想容斥........ 这题中,我们把图分成若干块,每块的最大值域不同 蓝后根据乘法原理把每块的方案数(互不相干)相乘. ...
- [BZOJ5010][FJOI2017]矩阵填数(状压DP)
5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 90 Solved: 45[Submit][Status][ ...
- bzoj5010: [Fjoi2017]矩阵填数
Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...
- 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. ...
- BZOJ5010 FJOI2017矩阵填数(容斥原理)
如果只考虑某个子矩阵的话,其最大值为v的方案数显然是vsize-(v-1)size.问题在于处理子矩阵间的交叉情况. 如果两个交叉的子矩阵所要求的最大值不同,可以直接把交叉部分划给所要求的最大值较小的 ...
- P3813 [FJOI2017]矩阵填数
传送门 矩阵很大,但是发现 $n$ 很小,从这边考虑,对于一个一堆小矩阵放在一起的情况 考虑把每一块单独考虑然后方案再乘起来 但是这些奇怪的东西很不好考虑 所以暴力一点,直接拆成一个个小块 但是这样我 ...
- 【BZOJ】5010: [Fjoi2017]矩阵填数
[算法]离散化+容斥原理 [题意]给定大矩阵,可以每格都可以任意填1~m,给定n个子矩阵,要求满足子矩阵内的最大值为vi,求方案数. n<=10,h,w<=1w. [题解] 此题重点之一在 ...
随机推荐
- 构造方法概念,自定义构造(init)方法的用途, 类工厂方法(就是直接用类名 类调用)
一. 构造方法 构造方法:在OC中init开头的方法, 我们称之为构造方法 构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值 // 比如我们定义一个Person的类,然后 ...
- wdcp挂载数据盘为WWW以及之后出现的各种问题解决方法
昨天晚上突然有客户反映服务器访问不了,经检查后是因为磁盘满了! 购买阿里云的ECS选择linux系统的时候会赠送20G的系统盘,通常来讲自己用的话基本够了,但是我们作为网络公司,安装了一个WDCP后给 ...
- Luogu 5043 【模板】树同构([BJOI2015]树的同构)
BZOJ 4337 简单记录一种树哈希的方法:以$x$为根的子树的哈希值为$\sum_{y \in son(x)}f_y*base_i$,$f_y$表示以$y$为根的树的哈希值,其中$i$表示$f_y ...
- Luogu 3206 [HNOI2010]城市建设
BZOJ 2001 很神仙的cdq分治 先放论文的链接 顾昱洲_浅谈一类分治算法 我们考虑分治询问,用$solve(l, r)$表示询问编号在$[l, r]$时的情况,那么当$l == r$的时候 ...
- 关于wamp中升级PHP+Apache 的问题
首先个人不建议wamp中升级php版本,如果你不信可以试一试,当你php升级后发想,奥,Apache版本不匹配,然后又去升级Apache,结果搞了半天,弄出来了就好,要是没出来,可能你会气死(好吧,气 ...
- HDU 3723 Delta Wave (高精度+calelan数)
题意:给定一个图,问你只能向上向下,或者平着走,有多少种方法可以走到最后一个格. 析:首先先考虑,如果没有平的情况就是calelan数了,现在有平的情况,那么就枚举呗,因为数很大,所以要用高精度. 答 ...
- jQuery拾忆
用jQuery操作select元素 http://www.jb51.net/article/23648.htm 表单中如果用disabled属性,则提交时不会提交该数据,尽量使用readonly属性 ...
- C# - dynamic 特性
dynamic是FrameWork4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译期默认dynamic对象支持你想要的任何特性. 比如,即使 ...
- web利用table表格生成excel格式问题
当我们把web页面上的table导成excel形式时,有时候我们的数据需要以特定的格式呈现出来,这时候我们就需要给指定的单元格添加一些样式规格信息. 文本:vnd.ms-excel.numberfor ...
- C# HTML转EXCEL的方法
private void ToExcel(string html) { Response.ContentType = "application/force-download"; R ...