【BZOJ-4455】小星星 容斥 + 树形DP
4455: [Zjoi2016]小星星
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 204 Solved: 137
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2
1 3
1 4
4 1
4 2
4 3
Sample Output
HINT
Source
Solution
一道容斥的好题
我们一共要满足两个限制:1.树中的一个点对应图中一个点,且一一对应 2.树中两点有边的,图中两点也对应有边
首先我们考虑最暴力的方法,如果同时满足两个限制,用$O(N^{N})$的时间去枚举,然后计数
那如果我们放宽一个限制,只统计满足限制2的数目,这显然可以用树形DP在$O(N^{3})$的时间里得到的
这里得到的是有$K$个点可以映射,但不保证$K$个点都被映射到,且不保证每个点只被映射一次
那么考虑用容斥去统计出答案,答案就是$Ans(N)-Ans(N-1)+Ans(N-2)-Ans(N-3)+Ans(N-4).....$
这样容斥的时候的枚举是$O(2^{N})$的
所以总的复杂度是$O(2^{N}×N^{3})$的
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
#define LL long long
#define MAXN 50
int N,M;
struct EdgeNode{int next,to;}edge[MAXN<<];
int head[MAXN],cnt=;
void AddEdge(int u,int v) {cnt++; edge[cnt].next=head[u]; head[u]=cnt; edge[cnt].to=v;}
void InsertEdge(int u,int v) {AddEdge(u,v); AddEdge(v,u);}
LL dp[MAXN][MAXN],ans,now,tmp;
int lt[MAXN][MAXN],bin[MAXN],tot,a[MAXN];
void DFS(int now,int last)
{
for (int i=head[now]; i; i=edge[i].next)
if (edge[i].to!=last) DFS(edge[i].to,now);
for (int i=; i<=tot; i++)
{
dp[now][i]=;
for (int j=head[now]; j; j=edge[j].next)
if (edge[j].to!=last)
{
tmp=;
for (int k=; k<=tot; k++)
if (lt[a[k]][a[i]]) tmp+=dp[edge[j].to][k];
dp[now][i]*=tmp;
}
}
}
int main()
{
N=read(),M=read();
for (int x,y,i=; i<=M; i++) x=read(),y=read(),lt[x][y]=lt[y][x]=;
for (int x,y,i=; i<=N-; i++) x=read(),y=read(),InsertEdge(x,y);
bin[]=; for (int i=; i<=N; i++) bin[i]=bin[i-]<<;
for (int i=; i<=bin[N]-; i++)
{
now=; tot=;
for (int j=; j<=N; j++) if (i&bin[j-]) a[++tot]=j;
DFS(,);
for (int j=; j<=tot; j++) now+=dp[][j];
if ((tot&)==(N&)) ans+=now; else ans-=now;
}
printf("%lld\n",ans);
return ;
}
【BZOJ-4455】小星星 容斥 + 树形DP的更多相关文章
- BZOJ 4455: [Zjoi2016]小星星(容斥+树形dp)
传送门 解题思路 首先题目中有两个限制,第一个是两个集合直接必须一一映射,第二个是重新标号后,\(B\)中两点有边\(A\)中也必须有.发现限制\(2\)比较容易满足,考虑化简限制\(1\).令\(f ...
- [LOJ2542][PKUWC2018]随机游走(MinMax容斥+树形DP)
MinMax容斥将问题转化为求x到S中任意点的最小时间. 树形DP,直接求概率比较困难,考虑只求系数.最后由于x节点作为树根无父亲,所以求出的第二个系数就是答案. https://blog.csdn. ...
- 4.19 ABC F path pass i 容斥 树形dp
LINK:path pass i 原本想了一个点分治 yy了半天 发现重复的部分还是很难减掉 况且统计答案的时候有点ex. (点了别人的提交记录 发现dfs就过了 于是yy了一个容斥 发现可以直接减掉 ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- hdu-5794 A Simple Chess(容斥+lucas+dp)
题目链接: A Simple Chess Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- 浅析容斥和DP综合运用
浅析容斥和DP综合运用 前言 众所周知在数数题中有一种很重要的计数方法--容斥.但是容斥有一个很大的缺陷:枚举子集的复杂度过高.所以对于数据规模较大的情况会很乏力,那么我们就只能引入容斥DP. 复习一 ...
- 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 426 Solved: 255 Description 小Y是 ...
- 4455[Zjoi2016]小星星 容斥+dp
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 527 Solved: 317[Submit][Status] ...
- UOJ185 ZJOI2016 小星星 容斥、树形DP
传送门 先考虑一个暴力的DP:设\(f_{i,j,S}\)表示点\(i\)映射到了图中的点\(j\),且点\(i\)所在子树的所有点映射到了图中的集合\(S\)时的映射方案数,转移暴力地枚举子集即可, ...
随机推荐
- BZOJ 1014 【JSOI2008】 火星人prefix
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
- 注册URL模式与HttpHandler的映射关系
注册URL模式与HttpHandler的映射关系 ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHan ...
- C10K 问题引发的技术变革
C10K 问题引发的技术变革 http://rango.swoole.com/archives/381
- 资源搜集:Git精品文章推荐,常年更新
以下放置的是搜集到的Git精品文章,常年更新: Git 常用命令详解(二) Git版本控制软件结合GitHub从入门到精通常用命令学习手册 Pro Git(中文版)
- c++ 头文件
可以将程序分为二部分: 头文件:包含结构声明和使用这些结构的函数的原型 源代码文件: 包含与结构有关的函数的代码 不要将函数的定义或变量的声明放在头文件里, 一般头文件可以包含以下内容 >函数原 ...
- OpenCV中的神器Image Watch
Image Watch是在VS2012上使用的一款OpenCV工具,能够实时显示图像和矩阵Mat的内容,跟Matlab很像,方便程序调试,相当好用.跟VS2012配合使用,简直就是一款神器!让我一下就 ...
- 如何用 fiddler 调试线上代码
有时代码上线了,突然就碰到了坑爹的错误.或者有时看别人家线上的代码,对于一个文件想 fork 下来试试效果又不想把全部文件拉到本地,都可以使用 fiddler 的线上调试功能. 比方说我们打开携程的首 ...
- DOM 概况
DOM(文档对象模型)是针对 HTML 和 XML 文档的一个API(应用程序编程接口).DOM 描绘了一个层次化的节点树,允许开发人员添加.移除和修改页面的某一部分. 层次节点 DOM可以将任何 H ...
- STM32-外部中断,没有硬件干扰就是快乐
一:触发方式 STM32 的外部中断是通过边沿来触发的,不支持电平触发: 二:外部中断分组 STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源 ...
- Android引导指示层的制作 (ViewStub + SharePreference)
引导指示界面是个什么鬼东西?一张图即明了: