P3813 [FJOI2017]矩阵填数

shadowice1984说:看到计数想容斥........

这题中,我们把图分成若干块,每块的最大值域不同

蓝后根据乘法原理把每块的方案数(互不相干)相乘。

怎么计算每块方案数呢

把子矩阵按最大值从小到大排序

暴力预处理好每$k(1<=k<=n)$个矩阵之间的交集、并集

设最大值为$v$的位置的集合大小为$S$

那么我们算出来(本层)的结果就是v^{|S|}

然鹅我们并没有减去某些矩阵没有到最大值(最大只取到$v-1$)的情况

于是对于每个最大值为$v$的子矩阵在$S$中的部分$T$,我们要减去$(v-1)^{|T|}*v^{|S-T|}$

但是我们又发现,多减去了某2个子矩阵都没有到最大值的情况,于是我们就把它加起来

再减去3个子矩阵都没到最大值的情况

.............

这就是容斥原理辣

“最大值为$v$的位置的集合大小为$S$”,这个咋算呢

$|S|=($最大值$<=v$的位置的集合大小)$-$(最大值$<v$的集合大小),$T$同理。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int mod=1e9+;
inline ll Min(ll a,ll b){return a<b?a:b;}
inline ll Max(ll a,ll b){return a>b?a:b;}
ll Pow(ll x,ll y){
ll re=;
for(;y;y>>=,x=x*x%mod)
if(y&) re=re*x%mod;
return re;
}
struct Matrix{
ll xl,yl,xr,yr,v;
bool operator < (const Matrix &tmp) const{return v<tmp.v;}
void operator &= (const Matrix &tmp) {
xl=Max(xl,tmp.xl), xr=Min(xr,tmp.xr);
yl=Max(yl,tmp.yl), yr=Min(yr,tmp.yr);
}
inline void init(){
scanf("%lld%lld%lld%lld%lld",&xl,&yl,&xr,&yr,&v);
}
inline bool null(){return xl>xr||yl>yr;}
inline ll area(){return (xr-xl+)*(yr-yl+);}
}a[],p;
int T,m,n,uni[],ist[],siz[];ll h,w;
void Solve(){
memset(uni,,sizeof(uni));
scanf("%lld%lld%d%d",&h,&w,&m,&n);
for(int i=;i<n;++i) a[i].init();
sort(a,a+n); int Mx=(<<n)-;
for(int i=;i<=Mx;++i){//暴力处理交集
p.xl=;p.yl=;p.xr=h;p.yr=w;
for(int j=,u=i;!p.null()&&u;u>>=,++j)
if(u&) p&=a[j];
ist[i]=p.null()?:p.area();
}
for(int i=;i<=Mx;++i)//暴力处理并集
for(int j=i;j;j=(j-)&i)
uni[i]+=((siz[j]&)?:-)*ist[j];
int nw=,ls=;
ll sum,tot,re,k,ans=Pow(m,h*w-uni[Mx]);
for(int i=;i<n;++i){//分层处理最大值为$a[i].v$的块的方案数
nw|=(<<i);
if(a[i].v==a[i+].v) continue;
sum=uni[nw|ls]-uni[ls];
re=Pow(a[i].v,sum);
for(int u=nw;u;u=(u-)&nw){
tot=uni[u|ls]-uni[ls];
k=Pow(a[i].v-,tot)*Pow(a[i].v,sum-tot)%mod;
if(siz[u]&) re=(re-k+mod)%mod;
else re=(re+k)%mod;
}ans=ans*re%mod; ls|=nw; nw=;
}printf("%lld\n",ans);
}
int main(){
for(int i=;i<=;++i) siz[i]=siz[i>>]+(i&);
scanf("%d",&T);
while(T--) Solve();
return ;
}

P3813 [FJOI2017]矩阵填数(组合数学)的更多相关文章

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

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

  2. P3813 [FJOI2017]矩阵填数

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

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

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

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

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

  5. bzoj5010: [Fjoi2017]矩阵填数

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

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

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

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

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

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

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

  9. [FJOI2017]矩阵填数

    [Luogu3813] [LOJ2280] 写得很好的题解 \(1.\)离散化出每一块内部不互相影响的块 \(2.\)\(dp[i][j]\)为前 \(i\) 种重叠块其中有 \(j\) 这些状态的矩 ...

随机推荐

  1. [LeetCode] 78. Subsets tag: backtracking

    Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solut ...

  2. iOS 正则表达式(一)

    在iOS开发中,正则一直是最常用的,但也是一直记不住的,现在做一些简单的总结 我们在网上找的正则,要有'\',这个在iOS是转义符,需要'\\'这样 int main(int argc, const ...

  3. 42.PHP--电商网站的询价插件

    windows下使用php自带的mail函数实现简单的邮件发送实例(QQ亲试成功) 功能实现:通过中间邮箱把客户的需求和产品信息全部发送到公司的业务员邮箱 环境及工具: win7_64bit phps ...

  4. 路径遍历:ZIP条目覆盖

    程序在解压zip文件时,如果没有验证zip条目,攻击者可能对条目覆盖,从而造成路径遍历 例如:以下代码示例解压zip文件.    static final int BUFFER = 512;    / ...

  5. HDU 1568 Fibonacci(大数前4位)

    转载自:http://blog.csdn.net/thearcticocean/article/details/47615241 分析:x=1234567.求其前四位数: log10(x)=log10 ...

  6. composer----------composer初体验,如何安装,如何下载

    最近PHP里面比较火的一款框架laravel,想学一下看下这个框架到底哪里好.这款框架的中文官网激励推荐composer,没办法就去学了一些composer.结果整了半天,还不如看一段短视频学的容易. ...

  7. PHP 中最全的设计模式(23种)

    https://my.oschina.net/botkenni/blog/1603660 PHP 中最全的设计模式(23种) 原 botkenni 发布于 01/07 21:22 字数 8726 阅读 ...

  8. Beta冲刺1.0

    1. 提供当天站立式会议照片一张 2. 每个人的工作 (有work item 的ID) 3. 发布项目燃尽图 4. 每人的代码/文档签入记录 (1)代码签入记录 (2)代码签入链接   链接1   链 ...

  9. DX9 空间坐标变换示例代码

    // @time 2012.3.25 // @author jadeshu #include <Windows.h> #include <d3d9.h> #include &l ...

  10. url中是否加斜杠/

    通常来说,不加斜杠的形式(如”example.jsp”)请求的是相对于当前页面路径的资源 http://localhost:8080/webapp/examole:加斜杠的形式(”/example.j ...