Description

  https://loj.ac/problem/3023
  一句话题意:给你一棵完全二叉树,每条边有一个方向,求这棵树有多少种不同的拓扑序。

Solution

  简化题意后,其实就是一个普及组树形 DP。
  设 \(dp(i,j)\) 表示以点 \(i\) 为根的子树中,\(i\) 号点排第 \(j\) 名的方案数。
  利用 \(j\) 这个辅助维,我们可以枚举点 \(i\) 的排名 \(k\),扫一遍点 \(i\) 的所有儿子,每次会新来一个以 \(v\) 为根的子树合并到以 \(i\) 为根的子树上,枚举点 \(i\) 和点 \(v\) 在各自子树中的排名(记为 \(rank_i\) 和 \(rank_v\)),若题目限制点 \(i\) 排在点 \(v\) 前面,则枚举要满足 \(rank_i+rank_v\le k\),否则题目限制点 \(i\) 排在点 \(v\) 后面,则枚举要满足 \(rank_i+rank_v\gt k\)。
  设从 \([1,k-1]\) 中选 \(rank_i-1\) 个整数的方案数为 \(L\),从 \([k+1,size_i+size_v]\) 中选 \(size_i-rank_i\) 个整数的方案数为 \(R\),则 \(dp(i,k) += dp(i,rank_i)\times dp(v,rank_v)\times L\times R\)。这很好理解。
  最后算时间复杂度,还是那个套路,看起来是 \(O(n^4)\),其实还是 \(O(n^3)\),因为最里面两层循环的最大上界分别为 \(size_i\) 和 \(size_v\),这等价于在两棵子树内选 \(2\) 个点。那么这就是个以前讲过的套路,树上每对点只会在 LCA 处被枚举一次,故最里面两层循环套 dfs 的时间是 \(O(n^2)\),乘上一个枚举 \(k\) 的循环,总时间 \(O(n^3)\)。

  code

【CQOI2017】老C的键盘的更多相关文章

  1. [CQOI2017]老C的键盘

    [CQOI2017]老C的键盘 题目描述 额,网上题解好像都是用的一大堆组合数,然而我懒得推公式. 设\(f[i][j]\)表示以\(i\)为根,且\(i\)的权值为\(j\)的方案数. 转移: \[ ...

  2. [BZOJ4824][Cqoi2017]老C的键盘 树形dp+组合数

    4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 218  Solved: 171[Submit][Statu ...

  3. [BZOJ4824][CQOI2017]老C的键盘(树形DP)

    4824: [Cqoi2017]老C的键盘 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 193  Solved: 149[Submit][Statu ...

  4. bzoj 4824: [Cqoi2017]老C的键盘

    Description 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 ...

  5. [bzoj4824][Cqoi2017]老C的键盘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员.     作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序在某种 ...

  6. [bzoj4824][洛谷P3757][Cqoi2017]老C的键盘

    Description 老 C 是个程序员. 作为一个优秀的程序员,老 C 拥有一个别具一格的键盘,据说这样可以大幅提升写程序的速度,还能让写出来的程序 在某种神奇力量的驱使之下跑得非常快.小 Q 也 ...

  7. Luogu P3757 [CQOI2017]老C的键盘

    题目描述 老C的键盘 题解 显然对于每个数 x 都有唯一对应的 \(x/2\) , 然而对于每个数 x 却可以成为 \(x*2\) 和 \(x*2+1\) 的对应数 根据这一特性想到了啥??? 感谢l ...

  8. 洛谷 P3757 [CQOI2017]老C的键盘

    题面 luogu 题解 其实就是一颗二叉树 我们假设左儿子小于根,右儿子大于根 考虑树形\(dp\) \(f[u][i]\)表示以\(u\)为根的子树,\(u\)为第\(i\)小 那么考虑子树合并 其 ...

  9. BZOJ3167/BZOJ4824 HEOI2013SAO/CQOI2017老C的键盘(树形dp)

    前者是后者各方面的强化版. 容易想到设f[i][j]表示i子树中第j小的是i的方案数(即只考虑相对关系).比较麻烦的在于转移.考虑逐个合并子树.容易想到枚举根原来的排名和子树根原来的排名,算一发组合数 ...

  10. 【题解】CQOI2017老C的键盘

    建议大家还是不要阅读此文了,因为我觉得这题我的解法实在是又不高效又不优美……只是想要记录一下,毕竟是除了中国象棋之外自己做出的组合dp第一题~ 首先如果做题做得多,比较熟练的话,应该能一眼看出这题所给 ...

随机推荐

  1. 分布式消息通信之RabbitMQ Tutorials

    目录 官网 1 Hello World! 1.1 生产者demo producer 1.2 消费者demo consumer 1.3 查看queue队列中的信息 页面查看,可看到有4条消息 命令查看 ...

  2. 【AMAD】django-channels -- 为Django带来异步开发

    动机 简介 个人评分 动机 目前web生态的发展带来了很多异步特性,比如websocket.而原生Django并不支持. 简介 django-channels1为Django带来了Websocket, ...

  3. TCP为什么要三次握手?

    在<计算机网络>一书中其中有提到,三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是: 一端(client)A发出去的第一个连接请求报文并没有丢 ...

  4. 详解Arduino Uno开发板的引脚分配图及定义(重要且基础)

    首先开发板实物图如下: 在本篇文章中,我们将详细介绍Arduino开发板的硬件电路部分,具体来说,就是介绍Arduino Uno开发板的引脚分配图及定义.Arduino Uno微控制器采用的是Atme ...

  5. mfc中循环显示图片

    UINT CPalmIdentDlg::UpdateCImg(LPVOID p) { struct params *pa = (struct params*)p; int *imgarray = pa ...

  6. 【DSP开发】帮您快速入门 TI 的 Codec Engine

    德州仪器半导体技术(上海)有限公司 通用DSP 技术应用工程师 崔晶 德州仪器(TI)的第一颗达芬奇(DaVinci)芯片(处理器)DM6446已经问世快三年了.继DM644x之后,TI又陆续推出了D ...

  7. Java学习笔记-Lambda表达式

    Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数是接口)的实例 意义 自从Java 8开始,Java支持Lambda表达 ...

  8. [百度贴吧]飞腾1500a .VS. 龙芯3a3000: 同频实用性能对比

    贴吧关于 龙芯与飞腾的简单对比. https://tieba.baidu.com/p/5682824804?red_tag=0221728732 龙芯3a3000实用性能 ,还不如4年前发布的FT15 ...

  9. 自定义的C4P数据库连接池

    要想自己写一个数据库连接池 需要实现DataSoure这个类,然后重写getConnection 这个方法 public class C4p0 implements DataSource{ priva ...

  10. Django中的图片加载不出来解决方式记录

    背景:Python3.6 + Django2.2 在模板中的html文件中引用图片时,在浏览器中图片总是显示不出来,上网查了很多解决方式,但是都没有解决问题,最终尝试了多次后得以解决,但不清楚原理: ...