BZOJ4455/UOJ185 [Zjoi2016]小星星
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
题目链接:BZOJ4455
正解:DP+容斥原理
解题报告:
考虑暴力的话需要将一棵子树中的点去与另一个集合一一配对,而对于这种计数类问题,我们可以通过容斥来避开限制。
也就是说不管非法情况,用容斥的方法直接统计,最后得到答案。
我们先枚举整棵树对应的集合(一个映射),用f[i][j]表示以i为根的子树且i对应j的方案数,每次枚举根对应一个节点,再枚举每个儿子节点对应节点,乘起来就可以了。
考虑我这样做,显然会有大量节点映射到一个节点上去了,所以用容斥原理同加异减一下,把每个状态的ans综合起来就好了。
然而复杂度还是很虚,写了一发,然后被卡常了…
改变循环变量顺序,预处理可行的转移对象,终于AC了...
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
#define RG register
const int MAXN = 19;
const int MAXM = 520;
int n,m,ecnt,first[MAXN],to[MAXM],next[MAXM],all;
int mp[MAXN][MAXN],cnt,a[MAXN];
int head[MAXN],match[MAXN];
LL ans,f[MAXN][MAXN];//f[i][j]表示以i为根的子树的方案数,其中i对应的是j
struct edge{ int to,next; }e[MAXM];
inline void link(int x,int y){ next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y; }
inline void Link(int x,int y){ e[++ecnt].next=head[x]; head[x]=ecnt; e[ecnt].to=y; }
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void dp(RG int x,RG int fa){
RG int i,s1,j,k; for(i=first[x];i;i=next[i]) { if(to[i]==fa) continue; dp(to[i],x); }
RG LL now=0;
for(s1=1;s1<=cnt;++s1) {//枚举当前子树的根选什么
f[x][s1]=1;
for(j=first[x];j;j=next[j]) {
if(to[j]==fa) continue; now=0;
for(k=head[a[s1]];k;k=e[k].next) now+=f[to[j]][ match[e[k].to] ];
f[x][s1]*=now;
if(f[x][s1]==0) break;//剪枝...
}
}
} inline void work(){
n=getint(); m=getint(); all=(1<<n)-1; RG int i,j,x,y; RG LL now;
for(i=1;i<=m;++i) { x=getint(); y=getint(); mp[x][y]=mp[y][x]=1; }
for(i=1;i<n;++i) { x=getint(); y=getint(); link(x,y); link(y,x); }
for(i=1;i<=all;++i) {
x=i; cnt=0;
for(j=1;j<=n;++j) {
if(x&1) a[++cnt]=j; match[j]=cnt;
x>>=1; if(x==0) break;
}
ecnt=0; memset(head,0,sizeof(head));
for(j=1;j<=cnt;j++)
for(y=1;y<=cnt;y++)
if(mp[ a[j] ][ a[y] ])
Link(a[j],a[y]); dp(1,0);
now=0;
for(j=1;j<=cnt;++j) now+=f[1][j]; if((cnt&1) == (n&1)) ans+=now;
else ans-=now;
}
printf("%lld",ans);
} int main()
{
work();
return 0;
}
BZOJ4455/UOJ185 [Zjoi2016]小星星的更多相关文章
- uoj185 [ZJOI2016]小星星 【dp + 容斥】
题目链接 uoj185 题解 设\(f[i][j]\)表示\(i\)为根的子树,\(i\)号点对应图上\(j\)号点时的方案数 显然这样\(dp\)会使一些节点使用同一个节点,此时总的节点数就不满\( ...
- UOJ185 ZJOI2016 小星星 容斥、树形DP
传送门 先考虑一个暴力的DP:设\(f_{i,j,S}\)表示点\(i\)映射到了图中的点\(j\),且点\(i\)所在子树的所有点映射到了图中的集合\(S\)时的映射方案数,转移暴力地枚举子集即可, ...
- bzoj4455 & loj2091 [Zjoi2016]小星星 容斥原理+树形DP(+状压DP?)
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4455 https://loj.ac/problem/2091 题解 很不错的一道题.(不过在当 ...
- BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]
4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...
- 4455[Zjoi2016]小星星 容斥+dp
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 527 Solved: 317[Submit][Status] ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
- 【BZOJ 4455】 4455: [Zjoi2016]小星星 (容斥原理+树形DP)
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 426 Solved: 255 Description 小Y是 ...
- 洛谷 P3349 [ZJOI2016]小星星 解题报告
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
- bzoj 4455 [Zjoi2016]小星星 树形dp&容斥
4455: [Zjoi2016]小星星 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 643 Solved: 391[Submit][Status] ...
随机推荐
- ubuntu设置开机启动脚本
rc.local脚本 rc.local脚本是一个ubuntu开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令.该脚本位于/etc/路径下,需要root权限才能修改. 该脚本具体格式如下: #! ...
- Powershell Get-registerkey(susid)
$servers=get-content D:\serverregister.txt Get-registerkey -ComputerName $servers | select computer, ...
- Java Json API:Gson使用简单入门
GSON是Google开发的Java API,用于转换Java对象和Json对象.本文讨论并提供了使用API的简单代码示例.更多关于GSON的API可以访问:http://sites.google.c ...
- jmeter操作 — 文件上传、下载
一.上传/下载的过程. 上传的过程就是你把你本地的文件,扔到服务器上的这么一个过程. 下载呢,就是把服务器上的文件拿过来,然后存到你本地的这么一个过程. 总结 ...
- Grunt-Less批量编译为css
Grunt批量编译less module.exports = function (grunt) { grunt.initConfig({ less: { main: { expand: true, s ...
- 序列化组件之生成hypermedialink
一 生成hypermedialink(极少数) 组件 class BooksSerializer(serializers.ModelSerializer): name = serializers.C ...
- jsp创建cookie
<jsp:include flush="true" page="header.jsp" /> <script type="text/ ...
- linux环境变量配置文件
环境变量配置文件中主要是定义对系统操作环境生效的系统默认环境变量,如PATH等.当你登陆Linux系统启动一个bash shell时,默认情况下bash会几个文件中查找命令,bash检查的启动文件取决 ...
- day13 迭代器
迭代器 'iterable' 可迭代的 内部含有__iter__方法的数据类型就是可迭代的 —— 可迭代协议 print(dir([])) print(dir({})) print(dir(5)) p ...
- s5_day3作业
# 一.元素分类 # 有如下值集合[11, 22, 33, 44, 55, 66, 77, 88, 99, 90...],将所有大于 # # 的值保存至字典的第一个key中,将小于 # # 的值保存至 ...