[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. [题解] 此题重点之一在 ...
随机推荐
- servlet01 项目demo、servlet生命周期
1 环境说明 jdk: 1.8 tomcat: 8.0 2 项目demo 2.1 新建一个动态的web项目 2.2 新建一个servlet类 该类必须继承 HttpServlet 技巧01:Htt ...
- Django--admin后台
需求 通过后台和models操作数据库表 实现 1.后台中看到数据库中的表 app01/admin.py 1 2 from app01 import models admin.site.regist ...
- Django--static静态文件引用
需求 引用静态文件的目录不写死 "django.core.context_processors.static", html引用 1 <script src="{{ ...
- 41、Aspera下载安装运用
参考:http://www.so.com/linkm=aLVHG%2FgJT4HyuVeK4%2BxX2LMFvF6oTiTCaruHE20pwjRia7DmVI2hIVfmw%2BFNPczCtvX ...
- groupie
def add_group(group): c = group.c.astype('float') group['d'] = c/c.sum() return group df = pd ...
- js精度(摘)
Math.formatFloat = function (f, digit) { var m = Math.pow(10, digit); return parseInt(f * m, 1 ...
- LightOJ 1248 Dice (III) (水题,期望DP)
题意:给出一个n面的色子,问看到每个面的投掷次数期望是多少. 析:这个题很水啊,就是他解释样例解释的太...我鄙视他,,,,, dp[i] 表示 已经看到 i 面的期望是多少,然后两种选择一种是看到新 ...
- CodeForces 489E Hiking (二分+DP)
题意: 一个人在起点0,有n个休息点,每个点有两个数值,分别表示距离起点的距离xi,以及所获得的愉悦值bi,这个人打算每天走L距离,但实际情况不允许他这么做.定义总体失望值val = sum(sqrt ...
- 国外物联网平台(6):Electric Imp
国外物联网平台(6)——Electric Imp 马智 公司背景 Electric Imp成立于2011年,公司设立在美国加利福尼亚州洛斯阿尔托斯和英国剑桥 公司投资者包括:富士康技术集团.PTI创投 ...
- wp8扩展器大全
<Extensions> <!--扩展照片中心--> <Extension ExtensionName="Photos_Extra_Hub" Cons ...