首页 > 其他分享 >[十二省联考 2019] 春节十二响

[十二省联考 2019] 春节十二响

时间:2023-11-02 15:55:17浏览次数:34  
标签:int 十二 合法 dep 2019 集合 联考

[十二省联考 2019] 春节十二响

感觉作为例题还是挺不错的。

感官上直接分析比较困难。不妨先考虑怎样的段长集合是合法的。

注意到合法等价于对每一条从根到叶子的链都合法,考虑在链上贪心,尝试将每个和比他大的最小的点做匹配,如果能匹配上就是合法。很显然,如果仅考虑一条链,那么极小的一个合法段长集合就是这条链的点权集合。这启发我们考虑将每一条这样的根到叶子的链的答案合并,每次贪心取两者最大值即可。这样就获得了一个 \(O(n^2\log n)\) 的做法。

考虑优化这个过程,首先每条链的对应集合可以放到 DFS 的过程中去做,但是这样做不了。利用 dp 的思想,记 \(S_u\) 表示以 \(u\) 为根的子树对应的集合,那么每次转移合并子树即可。注意到合并的复杂度和深度有关,那么来个长链剖分就变成线性的了。算上堆的复杂度就是 \(O(n \log n)\)。

const int N = 2e5 + 10;
int n, a[N];
vector<int> G[N];

int dep[N];
priority_queue<int> s[N];

void dfs(int u) {
  int t = 0;
  for(int v : G[u]) {
    dfs(v);
    if(dep[v] > dep[t]) t = v;
  }
  dep[u] = dep[t] + 1;
  swap(s[u], s[t]);
  for(int v : G[u]) {
    if(v == t) continue;
    vector<int> buf;
    for(int k = 1; k <= dep[v]; ++k) {
      int w = s[v].top(); s[v].pop();
      int c = s[u].top(); s[u].pop();
      buf.emplace_back(max(w, c));
    }
    for(int x : buf) s[u].push(x);
  }
  s[u].push(a[u]);
}

int main() {
  read(n);
  for(int i = 1; i <= n; ++i)
    read(a[i]);
  for(int i = 2; i <= n; ++i) {
    int x; read(x);
    G[x].emplace_back(i);
  }
  dfs(1);
  LL ans = 0;
  while(s[1].size()) {
    ans += s[1].top();
    s[1].pop();
  }
  printf("%lld\n",ans);
}

标签:int,十二,合法,dep,2019,集合,联考
From: https://www.cnblogs.com/DCH233/p/17805599.html

相关文章

  • [ZJCTF 2019]NiZhuanSiWei
    打开题目,得到一段源码,如下。<?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents($text,'r')==="welcometothezjctf")){echo"<......
  • 如何在 Windows Server 2019 中启用 Telnet 客户端
    如何在WindowsServer2019中启用 Telnet 客户端这篇文章将介绍如何在Microsoft的WindowsServer2019中安装telnet 客户端。启用Telnet客户端首先,我们需要启用telnet客户端,如果我们不启用它,我们将在尝试使用它时得到类似于以下消息的结果。C:\>telnetgoogle.co......
  • P5659 [CSP-S2019] 树上的数
    相信大家都看过题,但还请搞清楚是数对应结点编号。这里用\(a_i\)表示\(i\)号结点对应的数。对于\(n\leq10\)的数据,全排列出删边的顺序然后模拟,取字典序最小的方案。对于菊花,仍然考虑删边的顺序,假设删边依次是\(rt\tov_1,rt\tov_2,\cdots,rt\tov_{n-1}\)。因为每删一......
  • P5666 [CSP-S2019] 树的重心
    考虑一个结点在什么情况下会成为重心。随便钦定一个根结点。对于结点\(u\),假设割掉了其子树\(v\)中的某条边或连接\(u\)和\(v\)的边,形成了一棵大小为\(k\)的新树。令\(mx\)表示除\(v\)子树外最大的子树大小(或\(n-siz_u\))。如果\(u\)成为了重心根据定义有\(2\ti......
  • 软件测试|Python科学计算神器numpy教程(十二)
    简介NumPy是Python中用于科学计算的一个强大的库,其中包含了丰富的数学和统计函数。这些统计函数允许用户对数组进行各种统计计算,例如平均值、标准差、方差、最大值、最小值等。在本文中,我们将详细介绍NumPy中一些常用的统计函数及其用法。统计函数示例numpy.amin()和numpy.......
  • P5404 [CTS2019] 重复 题解
    题目链接观察题目,我们发现直接计算是困难的,先构造单个合法的\(T\)分析其性质。为了构造出\(T\),先考虑构造时\(T\)时什么时候会出现不合法的情况,此时\(T\)会有一段和\(S\)相同的前缀,且这段前缀后面跟着的字符比\(S\)所跟的小。为了避免这种情况出现,我们需要在每次添......
  • [极客大挑战 2019]BuyFlag
    打开网页,发现右手边的菜单中有个PAYFLAG,打开后跳转到pay.php中,其中网页源代码有提示,主要内容如下:IfyouwanttobuytheFLAG:YoumustbeastudentfromCUIT!!!Youmustbeanswerthecorrectpassword!!!OnlyCuit'sstudentscanbuytheFLAG ~~~postmoneyand......
  • [RoarCTF 2019]Easy Calc
    题目一打开,是一个计算器。主页源代码如下,这里可以看到有一个calc.php文件,并且提示存在WAF(疑)。<!--I'vesetupWAFtoensuresecurity.--><script>$('#calc').submit(function(){$.ajax({url:"calc.php?num="+encodeURIComponent($(&q......
  • [极客大挑战 2019]PHP
    打开靶机页面后发现有提示:因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯。结合常用的备份字典,直接扫到存在www.zip文件,下载后解压打开,发现源码。在index.php中,关键代码如下:<?phpinclude'class.php';$select=$_GET['select'];$res=unserialize......
  • [极客大挑战 2019]PHP
    打开靶机页面后发现有提示:因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯。结合常用的备份字典,直接扫到存在www.zip文件,下载后解压打开,发现源码。在index.php中,关键代码如下:<?phpinclude'class.php';$select=$_GET['select'];$res=unseria......