A - 跳蚤电话

观察性质,可以发现每次连边的点一定是有祖先关系的,可以直接挂上去一个,也可以是在中间边上插入一个点。

所以我很自然的想到去计算树上的点的加入顺序,因为一但加入顺序确定,每一次的操作也就随之确定。

这东西有点类似于拓扑序计数,只不过是有一些限制。

对于一颗子树来说,我们可以发现如果root排在了第一个位置,那么对于所有儿子对应的子树就可以随便排列,也就是一个可重集排列。

另一种情况如果root不在第一个位置,那么root前面的点一定来自于同一个儿子对应的子树,root后面又是一个可重集排列。

根据以上性质我们可以考虑DP,设 \(dp_{x,i}\)为考虑x子树,x节点第i个加入所对应的方案数,\(sum_x\) 表示当前x子树并上来了多少节点,\(all_x=\sum_{i=1}^{siz_x}dp_{x,i}\)。

\(dp_{x,i}=(dp'_{x,i} \times C_{sum-i+siz_v}^{siz_v}+(i!=1)\times dp'_{x,1}\times C_{sum-i+siz_v}^{siz_v-i+1})\times all_v\)

这样得到一个复杂度上界为 \(O(n^2)\) 的做法。

观察发现,dp的实质就是考虑根的位置还有根前面的点来自于谁,于是直接枚举就行,没有必要dp。一个点会被所有的祖先枚举到,但是上界依然是\(O(n^2)\)。

不过对于大树比较浅的情况就可以通过了,期望得分 71pts。

我们尝试优化,但是上面做法的本质就是在枚举根的位置,这一步我暂时无法省略,所以无法通过本题。

换一个思路,加入行不通,我们考虑删除。

发现计算方案数并不好算,因为每并上一棵子树都需要去乘上组合数。考虑计算概率,这样的好处是对于每一棵子树概率独立,最后乘上总方案数即可。

设 \(f_x\) 为删完x子树,得到的排列是合法排列的概率。

一个朴素的做法是枚举最后一个删除的是谁。

\(f_x=\frac{1}{siz_x}\times (\prod_{v\in son_x}f_v+\sum_{v\in son_x}\frac{siz[v]}{siz[x]}f_v\times \prod_{k\in son_x \ and\ k!=v}f_k)\)

这样计算复杂度为\(O(nlogn)\)。期望得分 100pts。

把式子拆开,可以得到一个 \(O(n)\)的算法,但是拓展意义不大,所以就不多说了。

B - 密码锁

这个我只会暴搜啦。没什么好说的。

首先这个图是个竞赛图,缩点以后是条链,我们需要计算强联通分量的个数,实际上可以转化为计算割集的个数。所谓割集就是对于一个集合S,集合内部和外部的连边都是指向外边的。

暴搜计算可以得到 49pts。

根据期望的线性性,我们可以单独算出每个集合对应的概率,然后加起来就是期望。

看到大部分边权都是0.5,只有小部分是特殊的。于是我们可以分集合大小计算期望,只计算特殊边,剩下的最后乘上去即可。

考虑到特殊边的边数是不一定的,所以我们给每个特殊边的贡献乘上2,最后乘0.5,这样特殊边的边数就没有影响了。

一个朴素的思路是枚举哪些边有贡献,显然这些边的两端不在一个集合,其余没贡献的特殊边的两端在同一个集合。

这样就可以进行黑白染色,然后缩成很多个联通块,最后做一遍背包往集合里面加点就行。

复杂度 \(O(2^m\times n^2)\)。这个复杂度有点高,平颈在于背包。

观察到我们实际上是在把联通块当成物品来做背包,那么可以分开计算每个联通块的贡献。

具体的,枚举每个联通块中在割集中的是那些点,然后加上贡献。

最后对于每一个联通块,分贡献点数的多少往上做背包即可。

因为只有m条边,所以同一个联通块最多有m+1个点。复杂度 \(O(2^{m+1}+n^2)\)。期望得分 100pts。

DP 专练的更多相关文章

  1. 10-19 dp专练

    dp专练,终于克服了一次自己对dp的恐惧,磕出来一道题. 得分情况: T1:0 T2:0 T3:0 emmmm,磕出来的题是T2,但是因为初始化和int long long的原因爆零了 T1:n只狼排 ...

  2. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

  3. 记502 dp专练

    趁着503的清早 我还算清醒把昨天老师讲的内容总结一下,昨天有点迷了 至使我A的几道题都迷迷糊糊的.(可能是我太菜了) 这道题显然是 数字三角形的变形 好没有经过认真思考然后直接暴力了 这是很不应该的 ...

  4. P1251 递推专练3

    递推专练3 描述 Description 圆周上有N个点.连接任意多条(可能是0条)不相交的弦(共用端点也算相交)共有多少种方案? 输入格式 Input Format 读入一个数N.<=N< ...

  5. [大山中学dp常练-4 Rounds]

    Round#1 2016.9.28 这次晚练十分sb 有点浪费时间 全是dp题 先说过程 3分钟草了第一题之后感觉好像有点水 然后翻了翻题目 看了看第一第四题两颗星 其他三颗星 然后一下子第二题题目太 ...

  6. 数位dp小练

    最近刷题的同时还得填填坑,说来你们也不信,我还不会数位dp. 照例推几篇博客: 数位DP讲解 数位dp 的简单入门 这两篇博客讲的都很好,不过代码推荐记搜的形式,不仅易于理解,还短. 数位dp的式子一 ...

  7. 2016.4.9 NOI codevs动态规划专练

    1.NOI 最大子矩阵 1:最大子矩阵 总时间限制:  1000ms 内存限制:  65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...

  8. 2016.4.3 动态规划NOI专练 王老师讲课整理

    1.6049:买书 总时间限制:  1000ms 内存限制:  65536kB 描述 小明手里有n元钱全部用来买书,书的价格为10元,20元,50元,100元. 问小明有多少种买书方案?(每种书可购买 ...

  9. 【树形dp小练】HDU1520 HDU2196 HDU1561 HDU3534

    [树形dp]就是在树上做的一些dp之类的递推,由于一般须要递归处理.因此平庸情况的处理可能须要理清思路.昨晚開始切了4题,作为入门训练.题目都很easy.可是似乎做起来都还口以- hdu1520 An ...

随机推荐

  1. Sentry 开发者贡献指南 - SDK 开发(事件负载)

    内容整理自官方开发文档 系列 Docker Compose 部署与故障排除详解 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentr ...

  2. ZooKeeper基础知识总结

    数据模型 ZooKeeper数据模型是一个树状的数据结构,类似于文件系统:和文件系统的区别在于树中的每一个节点(叶子节点与非叶子节点)都可以保存数据,且每个节点的访问都必须从根节点开始,以斜线作为分隔 ...

  3. IOS 如何获取app更新链接 如【itms-apps://itunes.apple.com/cn/app/id1362432761?mt=8】

    这是iTunes接口地址 ,有兴趣可以看一下,我们要用到的接口如下,xxx 处换成自己 App 的 AppId ,AppId 可以在 iTunes Connect 里面看到. http://itune ...

  4. 编写Java程序,使用List集合和Map集合输出 市和区

    如图: 代码: import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java ...

  5. ClickHouse在监控系统中的应用

    一.背景 这个项目是一个监控系统,主要监控主机.网络设备.应用等.主机监控的数量有1500台左右,数量还在不断增长,加上网络设备和应用,目前总共监控的指标达到近40万个. 二.问题 一开始为了快速交付 ...

  6. 为什么要避免在 Go 中使用 ioutil.ReadAll?

    原文链接: 为什么要避免在 Go 中使用 ioutil.ReadAll? ioutil.ReadAll 主要的作用是从一个 io.Reader 中读取所有数据,直到结尾. 在 GitHub 上搜索 i ...

  7. Linux-saltstack-1 saltstack的安装与基本配置

    @ 目录 一.环境介绍 二.安装saltstack 1.配置安装yum源 2.安装salt-master 3.安装slat-minion 三.配置salt-master 1.指定master的地址 2 ...

  8. CSS基础 实战案例 模拟小米官方导航栏

    效果图 html结构 <ul> <li><a href="#">Xiaomi手机</a></li> <li> ...

  9. epoll实现原理

    作者:蓝形参链接:https://www.zhihu.com/question/20122137/answer/14049112来源:知乎 首先我们来定义流的概念,一个流可以是文件,socket,pi ...

  10. 用一道题 来 复习 MySQL 的 复杂 sql 语句

    1.前言 太久没有在数据库做一些复杂的sql了,基本上将数据库的查询逻辑全放在了Java里做, 一来呢,可以减轻数据库的负担,二来呢,在java写,逻辑感会更强,数据类型更丰富也容易操作. 然而... ...