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. Spring Boot 2 中如何使用 Log4j2 记录日志

    上一篇我们介绍了Spring Boot 2.x中默认日志框架Logback的使用.今天继续说说日志,接下来我们要讲是前段时间爆出核弹漏洞的Log4j2.虽然出了漏洞,让很多小伙伴痛苦了1-2周(加班) ...

  2. MongoDB基本介绍与安装(1)

    MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功 ...

  3. Java Web程序设计笔记 • 【第6章 Servlet技术进阶】

    全部章节   >>>> 本章目录 6.1 应用 Servlet API(一) 6.1.1 Servlet 类的层次结构 6.1.2 使用 Servlet API 的原则 6.1 ...

  4. Java初学者作业——用户输入一个小数,程序分解出整数部分和小数部分。

    返回本章节 返回作业目录 需求说明: 用户输入一个小数,程序分解出整数部分和小数部分. 实现思路: 接收用户控制台输入的小数. 用强制类型转换将整数部分得到. 使用用户输入的小数减去整数部分得到小数部 ...

  5. js 拟写登录页 可以拖动登录框

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  6. Oracle - 以 INSERT SQL语句形式导出结果集

    使用 SQLcl - 这是 SQL Developer 的命令行接口 下载 SQLcl sql sys/welcome@localhost:1521:orcl as sysdba #sql usern ...

  7. [.Net]使用ABP 数据库迁移migration遇到的坑及解决方案

    ​ 问题:在使用Update-Database时,突然出现"数据库中已存在名为 'XXX' 的对象". 检查发现__EFMigrationsHistory表中的MigrationI ...

  8. 《剑指offer》面试题35. 复杂链表的复制

    问题描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...

  9. leetcode 55. 跳跃游戏 及 45. 跳跃游戏 II

    55. 跳跃游戏 问题描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1, ...

  10. 用js判断页面是否加载完成实现代码

    方式一:window.onload: 当一个文档完全下载到浏览器中时,才会触发window.onload事件.这意味着页面上的全部元素对js而言都是可以操作的,也就是说页面上的所有元素加载完毕才会执行 ...