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. JFrame绝对布局

    通过代码:setLayout(null);设置容器布局为绝对布局. 添加控件要注意:一定要设置控件具体的位置.可通过代码setLocation(20, 20)或者setBounds(0, 0, 30, ...

  2. CentOS6.5安装python3.7

    1.下载python3 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 2.解压 [root@mycentos ~]# ta ...

  3. Entity Framework(Fluent API)

    一.概述 Fluent API 可以理解为一种从POCO到数据库的映射约定,包括字段长度,类型,主外键等等,在EF Code First进行开发时候经常用到. 1.主键 modelBuilder.En ...

  4. Xcode $(SRCROOT)和$(PROJECT_DIR)区别

    $(SRCROOT)代表的时项目根目录下 $(PROJECT_DIR)代表的是整个项目 PS:往项目添加文件时,例如.a等,要先show in finder ,复制到项目中,然后再拖到xcode项目中 ...

  5. cocos2d JS-(JavaScript) 静态方法的例子

    function User(name, age) { this.name = name; this.age = age; } var user = new User('angela',26); Use ...

  6. javascript获取style兼容性问题

    获取css 样式的方法有三种 : style, currentStyle , getComputedStyle style (无兼容性问题) 获取语法: ele.style.attr : 设置语法:e ...

  7. React创建组件的不同方式(ES5 & ES6)

    一. 首先缕清楚React.createElement.React.createClass.React.Component之间的关系 1. React.createElement(HTML eleme ...

  8. LeetCode167.两数之和II-输入有序数组

    给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2. 说明: 返回的下标值 ...

  9. <6>Lua元表和冒号 self

    Lua中没有像C.C++.JAVA中的类概念,面向对象等 ,但我们可以模拟出来 1. Lua中有个很重要的概念元表 设置元表setmetatable()函数  获取元表getmetatable()函数 ...

  10. html5-绝对路径/相对路径

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...