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. 剑指offer 67. 字符串转换为整数(Leetcode 8. String to Integer (atoi))

    题目:剑指offer 67题 需要考虑的情况:空指针.nullptr.空字符串"".正负号.数值溢出.在写代码的时候对这些特殊的输入都定义好合理的输出.可以定义一个全局布尔型变量g ...

  2. sleep(0) 的作用

    思考下面这两个问题: 假设现在是 2019-5-18 12:00:00.00,如果我调用一下 Thread.Sleep(1000) ,在 2019-5-18 12:00:01.00 的时候,这个线程会 ...

  3. Spark Scala当中reduce的用法和例子

    [学习笔记] reduce将RDD中元素前两个传给输入函数,产生一个新的return值,将新产生的return值与RDD中下一个元素(即第三个元素)组成两个元素,再被传给输入函数,这样递归运作,直到最 ...

  4. 真理胜于一切 JAVA模拟表单提交

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import ...

  5. JZOJ.1153【贪心算法】硬币交换

    好难啊!!! 可聪明的我还是解出来了!(逃 题目描述 小z最近迷上了一款游戏――To Be A Farmer,他在游戏中控制的人物是一个叫FZ的Farmer.FZ身上有G1个金币.S1个银币和B1个铜 ...

  6. lg 1478

    好多天没碰代码了,感觉忘得差不多了,没有学习感觉罪恶深重,从今天起开始补题啊啊! 简单零一背包,套模板就行. #include<bits/stdc++.h> using namespace ...

  7. php验证手机号记录

    看完就忘记录一下 正则: $roue = "/^1[3-9]\d{9}$/"; 前后/...... / 是正则必须的规则 ^1 : 手机号的必须是1开头   ^: 字符串开始的地方 ...

  8. 【AC自动机】Censoring

    [题目链接] https://loj.ac/problem/10059 [题意] 有一个长度不超过  1e5 的字符串 .Farmer John 希望在 T 中删掉 n 个屏蔽词(一个屏蔽词可能出现多 ...

  9. 将数组转化为List集合

    字符串转换为数组.将数组转换为List集合 public void testStringToList(){ String s="123-abc-456"; System.out.p ...

  10. 故事板(StoryBoards)和动画(Animations)

    Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations) 正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Blend ...