前言

此片题解大致按照笔者做题思路进行讲解。

简要题意

有一棵树,树上有偶数个节点。你需要给这些点两两配对,一组已经配对的点会将两点之间的树边进行一次覆盖。一组合法方案需要满足树上所有边都被覆盖至少一次,求合法方案数。

数据范围:\(n\le5000\)。

思路

首先我们去观察题目性质,发现没有什么特殊的地方。我最开始只想到一个非常暴力的 \(dp\),设 \(f_{u,i}\) 表示以 \(u\) 为根的子树内有 \(i\) 个点已经匹配好的方案数。但是当我去考虑转移时,我发现他有很多种情况:

  1. \(u\) 一个儿子的子树内互相匹配,但是需要有一个点与外面的点匹配(不然这个子树与 \(u\) 之间的边就无法被覆盖);
  2. 一个子树内的点向 \(u\) 的其他子树匹配;
  3. 一个子树的点向 \(u\) 子树以外的点匹配。

或许还有一些没有罗列出来,但反正就是不可做。于是我们正难则反,考虑先求出不合法的情况,然后容斥做。

题解

如何求不合法的情况呢?我们可以通过钦定一些边不覆盖来容斥。比如当我计算到以 \(u\) 为根的子树时,我就去枚举 \(u\) 所在的连通块的大小,对于一个 \(u\) 的儿子 \(v\),分讨一下连通块是否包括 \(v\)。

具体的,我们设 \(f_{u,i}\) 表示以 \(u\) 为根的子树,\(u\) 所在连通块大小为 \(i\) 的方案数。对于 \(v\) 在连通块的时候,有转移:

\[f_{u,i-j}\times f_{v,j}\rightarrow f_{u,i},v\in{\operatorname{son}_u,j<i}
\]

若 \(v\) 与 \(u\) 之间的边不覆盖,则有:

\[f_{u,i}\times f_{v,j}\rightarrow f_{u,i+j}
\]

你乍一看这不就是树上背包吗?时间复杂度 \(O(n^2)\),可以通过此题!

现在我们已经基本找出状态转移的方程,但现在我们还需要思考一个问题:

一个点数为 \(k\) 的连通块,将里面的点不重不漏两两匹配的方案数

首先对于 \(k\) 为奇数的时候是无贡献的;所以只用考虑 \(k\) 为偶数的情况。考虑递推求解答案,设 \(s_k\) 表示点数为 \(k\) 的贡献。对于一个点,我有 \(k - 1\) 种选择方案,而剩下的 \(k-2\) 个点的方案是 \(s_{k-2}\),固可得递推式:\(s_{k}=(k-1)\times s_{k-2}\)。

但考虑到我们只是没有考虑这些方案中会有的不合法情况,所以需要稍微容斥一下,在转移的时候还需要给一个 \((-1)^k\)。

然后看到之前的 \(dp\),我们发现对于第一种情况合并两个连通块似乎不好计算方案,于是我们改写状态,设 \(f_{u,i}\) 表示以 \(u\) 为根的子树,\(u\) 所在连通块大小为 \(i\) 时不考虑 \(u\) 所在连通块中匹配情况的方案数,这样在合并两个连通块时我们就直接把系数乘上就行,所以最后第一种情况的转移式为:

\[f_{u,i}\leftarrow f_{u,i-j}\times f_{v,j}\times(-s_i)
\]

最后答案就是 \(\sum\limits_{i}f_{1, i}\times s_i\)。

代码

void dfs(int u, int fa){
sz[u] = f[u][1] = 1;
for(int i = hd[u]; i; i = e[i].nxt){
int v = e[i].to; if(v == fa)continue;
dfs(v, u); copy(f[u], f[u] + 1 + sz[u], g);
fill(f[u], f[u] + 1 + sz[u], 0);
for(int j = 1; j <= sz[u]; ++j)for(int k = 1; k <= sz[v]; ++k)
f[u][j] = del(f[u][j], mul(mul(f[v][k], s[k]), g[j])),
f[u][j + k] = add(f[u][j + k], mul(g[j], f[v][k]));
sz[u] += sz[v];
}
}

ARC101E题解的更多相关文章

  1. ARC101E - Ribbons on Tree

    题目链接 ARC101E - Ribbons on Tree 题解 令边集\(S \subseteq E\) 设\(f(S)\)为边集S中没有边被染色的方案数 容斥一下,那么\(ans = \sum_ ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  10. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. vue3和elements创建应用

    一. 创建环境 1. 创建D:\code\vue 文件夹 2. vscode打开文件夹 3. 打开终端,输入 npm install -g @vue/cli 4. 配置环境变量 终端输入:npm co ...

  2. Consul-template, Nginx 实现Thrift Consul负载均衡

    整体架构 我们先看下整个框架的架构是什么样子的,这里我们有三个服务提供者和三个服务调用者,它们通过 Consul 和 Nginx,以及 Consul-template 来实现负载均衡. 说明 本例子是 ...

  3. 这可能是国内Qt/C++界最受欢迎开源项目之一/5.8Kstar/持续迭代更新

    一.前言 本项目大概在2020年开始的,大概在2022年重写了一遍,主要是分门别类存放.本项目主要是QWidget编写的一些开源的demo,支持Qt4.Qt5.Qt6,支持任意系统,预计会有100多个 ...

  4. Qt开发经验小技巧201-205

    编译生成debug版本动态库,文件末尾自动加上d结尾. CONFIG(debug, debug|release) { win32: TARGET = $$join(TARGET,,,d) mac: T ...

  5. Qt编写安防视频监控系统24-自定义悬浮条

    一.前言 自定义悬浮条功能集成在通用视频控件中,就是提供一个顶部的悬浮条,放一排功能按钮,有抓拍.录像.云台控制.关闭等,相当于可以直接单击对应的按钮针对该通道的视频进行操作,悬浮条的含义就是鼠标移入 ...

  6. Qt音视频开发12-mpv解码播放

    一.前言 之前玩了vlc解码和ffmpeg解码,前阵子有个客户需要换成mpv解码,于是研究了下mpv的使用方法,自从用了mpv以后发现爱不释手,这玩意天生适合极客和程序员啊,居然将各种处理封装成了命令 ...

  7. B站千万级长连接实时消息系统的架构设计与实践

    本文由哔哩哔哩资深开发工程师黄山成分享,原题"千万长连消息系统",本文进行了排版和内容优化等. 1.引言 在当今数字娱乐时代,弹幕已经成为直播平台上不可或缺的互动元素之一. 用户通 ...

  8. Appium_WebDriverAgent安装

      一.WebDriverAgent安装到ios测试设备 a) 切换到appium 的appium-webdriveragent目录(/Applications/Appium.app/Contents ...

  9. Note -「基本子串结构」速通笔记

      学习自 crashed 的<一类基础子串数据结构>摘抄及注解, 略过了一些 crashed 口中 "用不上" 的东西. 这里是速通笔记, 希望快速学习技巧的读者可以 ...

  10. CDS标准视图:维护活动类型描述 I_MaintenanceActivityTypeText

    视图名称:维护活动类型描述 I_MaintenanceActivityTypeText 视图类型:基础 视图代码: 点击查看代码 @AbapCatalog.sqlViewName: 'IMTACTTY ...