一本通 1783 矩阵填数 状压dp 容斥 计数
LINK:矩阵填数
刚看到题目的时候感觉是无从下手的。
可以看到有n<=2的点 两个矩形。
如果只有一个矩形 矩形外的方案数容易计算考虑 矩形内的 必须要存在x这个最大值 且所有值<=x.
直接计算是不易的 需要讨论到底哪个位置有最大值 然后还有重复 很繁琐。可以直接容斥 可以求出<=x的方案数 <=x-1的方案数也可以求出 做差即可得到存在x出现的方案数。
考虑两个矩形 如果不交 那么显然是各算各的 如果相交 讨论相交的这部分到底存在x 然后进一步的讨论从而计算答案。
可以发现这个分类讨论并不繁琐 不过当n扩大的时候就不能这么做了。
在填数的时候 毫无疑问的是 把一些矩形的交拉出来单独讨论。因为这部分填数会对一些矩形后续的填数造成影响。
对于所有的这种面积求方案即可。n<=10 可以进行状压。
设f[i]表示 只有状态i的矩形进行交的面积 注意 他们的交不能和其他矩形再交 因为 这会影响到其他矩形。
求法:容斥 考虑先把大的交w就出来 对于w的子集显然也会统计到这部分答案 所以枚举子集一下将自己的这部分贡献给消掉即可。
把这些面积拉出来后 就可以尝试填数了 容易发现填数的时候 可以设状态j表示当前已经满足的矩形的状态。
这样对于所有的交dp一下就可以得到总方案数了
const int MAXN=15,N=1<<10;
int T,n,W,H,m;
int maxx;
int w[MAXN];
struct wy
{
int x,y,xx,yy;
wy(int s1=0,int s2=0,int s3=0,int s4=0){x=s1;y=s2;xx=s3;yy=s4;}
inline wy friend operator &(wy a,wy b)//两个矩形的交.
{
return wy(max(a.x,b.x),max(a.y,b.y),min(a.xx,b.xx),min(a.yy,b.yy));
}
inline int S()
{
if(x>xx||y>yy)return 0;
return (xx-x+1)*(yy-y+1);
}
}t[MAXN];
inline int ksm(int b,int p)
{
int cnt=1;
while(p){if(p&1)cnt=(ll)cnt*b%mod;b=(ll)b*b%mod;p=p>>1;}
return cnt;
}
int ans,f[N][N];//f[i][j]表示已经处理过集合为1~i 已经满足限制的集合为j的方案数.
int s[N],b[N],c[N],s1[N],s2[N];
signed main()
{
freopen("1.in","r",stdin);
get(T);
while(T--)
{
memset(f,0,sizeof(f));
memset(s,0,sizeof(s));
get(H);get(W);get(m);get(n);ans=0;
rep(1,n,i)
{
int get(x),get(y),get(xx),get(yy);
t[i]=wy(x,y,xx,yy),get(w[i]);
}
maxx=(1<<n)-1;
fep(maxx,1,i)
{
int minn=m,ww=0;
wy wn=wy(1,1,H,W);
rep(1,n,j)
if(i&(1<<(j-1)))
{
if(w[j]==minn)ww=ww|(1<<(j-1));
if(w[j]<minn)
{
minn=w[j];
ww=(1<<(j-1));
}
wn=wn&t[j];
}
int ss=wn.S();
s[i]+=ss;c[i]=ww;
for(int j=i&(i-1);j;j=i&(j-1))s[j]-=s[i];
ans+=s[i];
s2[i]=ksm(minn-1,s[i]);
s1[i]=(ksm(minn,s[i])-s2[i]+mod)%mod;
}
ans=W*H-ans;ans=ksm(m,ans);
f[0][0]=1;
rep(0,maxx-1,i)
{
rep(0,maxx,j)
{
if(!f[i][j])continue;
f[i+1][j]=(f[i+1][j]+(ll)f[i][j]*s2[i+1])%mod;
f[i+1][j|c[i+1]]=(f[i+1][j|c[i+1]]+(ll)f[i][j]*s1[i+1])%mod;
}
}
put((ll)f[maxx][maxx]*ans%mod);
}
return 0;
}
一本通 1783 矩阵填数 状压dp 容斥 计数的更多相关文章
- 【BZOJ5010】【FJOI2017】矩阵填数 [状压DP]
矩阵填数 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 给定一个 h*w 的矩阵,矩阵的行 ...
- [BZOJ5010][FJOI2017]矩阵填数(状压DP)
5010: [Fjoi2017]矩阵填数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 90 Solved: 45[Submit][Status][ ...
- bzoj2669 [cqoi2012]局部极小值 状压DP+容斥
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2669 题解 可以发现一个 \(4\times 7\) 的矩阵中,有局部最小值的点最多有 \(2 ...
- P3160 [CQOI2012]局部极小值 题解(状压DP+容斥)
题目链接 P3160 [CQOI2012]局部极小值 双倍经验,双倍快乐 解题思路 存下来每个坑(极小值点)的位置,以这个序号进行状态压缩. 显然,\(4*7\)的数据范围让极小值点在8个以内(以下示 ...
- HDU 5838 (状压DP+容斥)
Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...
- codeforces 342D Xenia and Dominoes(状压dp+容斥)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud D. Xenia and Dominoes Xenia likes puzzles ...
- [清华集训2015 Day1]主旋律-[状压dp+容斥]
Description Solution f[i]表示状态i所代表的点构成的强连通图方案数. g[i]表示状态i所代表的的点形成奇数个强连通图的方案数-偶数个强连通图的方案数. g是用来容斥的. 先用 ...
- NOIp模拟赛 巨神兵(状压DP 容斥)
\(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...
- uoj#37. 【清华集训2014】主旋律(状压dp+容斥)
传送门 第一眼容斥,然后我就死活容不出来了-- 记\(f_i\)为点集\(i\)中的点强联通的方案数,那么就是总的方案数减去使\(i\)不连通的方案数 如果\(i\)不连通的话,我们可以枚举缩点之后拓 ...
随机推荐
- css modules是什么?
什么是CSS Modules? 官方的介绍是: 所有的 class 的名称和动画的名称默认属于本地作用域的 CSS 文件.所以 CSS Modules 不是一个官方的规范,也不是浏览器的一种机制,它是 ...
- 使用centos8搭建僵尸毁灭工程(PZ)服务器
自从领到了阿里云的ECS服务器后,本着既能熟悉linux操作,又能为喜欢的游戏搭建一个可以和朋友一起联机的服务器(游戏提供自建本地服务器极渣)的想法.作为linux小白的我翻遍了网上的资料,用了五天终 ...
- Vue 项目推荐,Github 过万 Star
电鸭社区-远程工作-自由职业-兼职外包-自由从这开始 嗨,我是 Martin,也叫老王.不少小伙伴,说自己是转行.自学,没有项目,今天推荐一个 Vue 实战项目 还记得 Martin 仿写过在线 Ma ...
- 复杂链表的复制(剑指offer-25)
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点.(注意,输出结果中请不要返回 ...
- python基础内容扩展复习
目录 一.关于编辑器 二.解释型和编译型 三.数据类型 1 一切皆对象 2 深浅拷贝 3 可变类型和不可变类型 四.闭包函数 一.关于编辑器 python开发:pycharm(收费),vscode(免 ...
- day41 几个琐碎知识点
目录 一.死锁与递归锁(了解) 1 死锁 2 递归锁 二.信息量 三.Event事件 四.三种优先级数据操作 1 队列 2 堆栈 3 自定义优先级 五.进程池和线程池 基本使用 六.协程 七.geve ...
- CSS(二)- 属性速览(含版本、继承性和简介)
相关链接 CSS3速查表,这里面列出了所有新增的属性以及新增或者修改的属性值 css参考手册,很好地一个常用网站 CSS定位(不可继承) CSS布局(仅visibility可继承) CSS尺寸(不可继 ...
- cookie与token
cookie: 登陆后后端生成一个sessionid放在cookie中返回给客户端,并且服务端一直记录着这个sessionid,客户端以后每次请求都会带上这个sessionid, 服务端通过这个ses ...
- node -v node is not define
安装node js 踩过的坑 应该是在CMD 命令里执行 node -v 我却傻傻的跑到 node.js 里执行 node -v 结果就报 node is not define 真相如下图!!!
- linux $* 和$@例子
参见ibm网站示例: https://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html 示例: [ian@pinguino ~]$ ...