[Luogu3813] [LOJ2280]

写得很好的题解

\(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]矩阵填数的更多相关文章

  1. [FJOI2017]矩阵填数——容斥

    参考:题解 P3813 [[FJOI2017]矩阵填数] 题目大意: 给定一个 h∗w 的矩阵,矩阵的行编号从上到下依次为 1...h ,列编号从左到右依次 1...w . 在这个矩阵中你需要在每个格 ...

  2. P3813 [FJOI2017]矩阵填数(组合数学)

    P3813 [FJOI2017]矩阵填数 shadowice1984说:看到计数想容斥........ 这题中,我们把图分成若干块,每块的最大值域不同 蓝后根据乘法原理把每块的方案数(互不相干)相乘. ...

  3. [BZOJ5010][FJOI2017]矩阵填数(状压DP)

    5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 90  Solved: 45[Submit][Status][ ...

  4. bzoj5010: [Fjoi2017]矩阵填数

    Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...

  5. bzoj 5010: [Fjoi2017]矩阵填数

    Description 给定一个 h*w 的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w.在这个矩阵中你需要在每 个格子中填入 1..m 中的某个数.给这个矩阵填数的时候有一 ...

  6. [luogu P3813] [FJOI2017] 矩阵填数 解题报告 (容斥原理)

    题目链接: https://www.luogu.org/problemnew/show/P3813 题目: 给定一个 h*w的矩阵,矩阵的行编号从上到下依次为 1..h,列编号从左到右依次1..w. ...

  7. BZOJ5010 FJOI2017矩阵填数(容斥原理)

    如果只考虑某个子矩阵的话,其最大值为v的方案数显然是vsize-(v-1)size.问题在于处理子矩阵间的交叉情况. 如果两个交叉的子矩阵所要求的最大值不同,可以直接把交叉部分划给所要求的最大值较小的 ...

  8. P3813 [FJOI2017]矩阵填数

    传送门 矩阵很大,但是发现 $n$ 很小,从这边考虑,对于一个一堆小矩阵放在一起的情况 考虑把每一块单独考虑然后方案再乘起来 但是这些奇怪的东西很不好考虑 所以暴力一点,直接拆成一个个小块 但是这样我 ...

  9. 【BZOJ】5010: [Fjoi2017]矩阵填数

    [算法]离散化+容斥原理 [题意]给定大矩阵,可以每格都可以任意填1~m,给定n个子矩阵,要求满足子矩阵内的最大值为vi,求方案数. n<=10,h,w<=1w. [题解] 此题重点之一在 ...

随机推荐

  1. layer使用总结一配置

    导入layer.js文件即可,必须先导入jquery.js文件,因为layer是基于jquery 版本匹配,在此记录一下,layer使用1.8下载时是2.3的版本,对应的jquery使用1.8.3版本 ...

  2. 1-在eclipse里面配置python(最详细)

    最近有时间打算学下python,打算学当然是得先搞好开发工具,网上搜一波,发现许多ide,居然可以在eclipse下写python,由于最近一直在搞java,所以已经装了eclipse,所以打算就在e ...

  3. 10个强大的Javascript表单验证插件推荐

    创建一个JavaScript表单验证插件,可以说是一个繁琐的过程,涉及到初期设计.开发与测试等等环节.实际上一个优秀的程序员不仅是技术高手,也应该是善假于外物的.本文介绍了10个不错的JavaScri ...

  4. Installing R under Unix-alikes

    Linux上R的安装 可参考https://cran.r-project.org/doc/manuals/r-release/R-admin.html#Installing-R-under-Unix_ ...

  5. 在Asp.Net中使用amChart统计图

    怎么在自己的ASP.NET页面插入可动态更新的数据统计图呢?网上的资源倒是不少(Fusioncharts.amCharts……),在这些资源中有一个比较好用:amChart,这个工具很炫,还能与用户交 ...

  6. inux内核的编译与安装 (转)

    1.查看ubuntu版本号: xdj@xdj-MS-:~$ sudo lsb_release -a [sudo] password for xdj: No LSB modules are availa ...

  7. 在线破解PDF

    在线破解PDF密码的6个网站 有很多PDF文件只能查看却不能被编辑和打印,因为它们已被保护.你并不知道被保护的PDF文档的密码却又急着向上司交差,怎么办?让 Ap PDF Password Recov ...

  8. python23种设计模式

      第一篇 Python与设计模式:前言 第二篇(23种设计模式) 创建类设计模式(5种) 单例模式.工厂模式.简单工厂模式.抽象工厂模式.建造者模式.原型模式 结构类设计模式(7种) 代理模式.装饰 ...

  9. JPA注解解析

    最近学习hibernate注解形式配置POJO类,将注解的解析记下来,以备以后使用. 例1. @Entity@Table(name="user")  public class Fl ...

  10. 为docker设置国内镜像

    docker的默认镜像(https://hub.docker.com/)地址,拉取镜像时是比较慢的,经常会超时,有时拉取几个小时.为了加快拉取的时间和速度,需要添加中国的镜像地址: 国内的加速地址: ...