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

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

时间:2023-08-26 14:46:17浏览次数:39  
标签:int top 合并 十二 pop 联考 2019 now 节点

题目链接

题意

给出一棵有 \(n\) 个节点的树,要求你将集合 \(\{1,2,\dots,n\}\) 划分成若干个子集,使得没有子集拥有节点对满足两个元素在树上是祖孙关系。你需要最小化子集的最大值之和。

先考虑带有启发性的子任务 \(4\)(树是一颗链)。具体来说,树有以下两种形态:

  1. 根节点是链的一个端点

    答案显然为 \(\sum_{i=1}^nM_i\)。

  2. 根节点不是链的端点

    此时树的形态:从根节点挂了两条链下去。

    考虑对根的每颗子树维护一个堆,堆中存对于当前子树最小划分集合的方案(根据情况 \(1\),\(\text{集合}=\{\forall M_i[i\in \text{subtree}]\}\))。在根节点处合并两颗子树的堆:采用贪心的思想,我们优先合并两个堆中最大的元素,放入新堆里,并在原来的堆中删去……以此类推,直到某一个堆为空,再把非空堆中剩余的元素加入新堆即可。

根据这样的合并方法,我们不难推出 \(O(n^2)\) 的通用解法。

但显然,\(O(n^2)\) 过不了这题,所以我们可以把暴力合并集合的方式改成树上启发式合并。合并 \(s1,s2\) 的时候要格外注意写法,正确的合并复杂度应该是 \(\min(s1,s2)\),不要让复杂度变成 \(\max(s1,s2)\)。

点击查看代码
#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); i++)
#define FR(i, a, b) for(int i = (a); i >= (b); i--)
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int n; ll ans, a[N];
vector<int> e[N];
priority_queue<ll> now, q[N];
void merge(int u, int v){
    if(q[u].size() < q[v].size())
        q[u].swap(q[v]);
    while(!q[v].empty()){
        now.push(max(q[u].top(), q[v].top()));
        q[u].pop(), q[v].pop();
    }
    while(!now.empty())
        q[u].push(now.top()), now.pop();
}
void dfs(int u){
    for(int &v: e[u])
        dfs(v), merge(u, v);
    q[u].push(a[u]);
}
int main(){
    scanf("%d", &n);
    FL(i, 1, n) scanf("%lld", &a[i]);
    FL(i, 2, n){
        int p; scanf("%d", &p);
        e[p].emplace_back(i);
    }
    dfs(1);
    while(!q[1].empty())
        ans += q[1].top(), q[1].pop();
    printf("%lld\n", ans);
    return 0;
}

标签:int,top,合并,十二,pop,联考,2019,now,节点
From: https://www.cnblogs.com/zac2010/p/17658777.html

相关文章

  • 代码随想录算法训练营第二十二天| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树
      235. 二叉搜索树的最近公共祖先    卡哥建议:相对于 二叉树的最近公共祖先 本题就简单一些了,因为 可以利用二叉搜索树的特性。   题目链接/文章讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%B......
  • NumPy学习挑战第十二关-数组操作
    Numpy数组操作Numpy中包含了一些函数用于处理数组,大概可分为以下几类:1、修改数组形状函数 描述reshape 不改变数据的条件下修改形状flat 数组元素迭代器flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组ravel 返回展开数组(1)numpy.reshapenumpy.reshape函数......
  • [九省联考 2018 D1T3] 秘密袭击
    考虑转化为求\(\gei\)的权值个数\(\gek\)的联通块数量。设\(f(u,i,j)\)表示\(u\)子树内含\(u\)联通块内权值\(\gei\)的有\(j\)个的方案数,\(g(u,i,j)\)维护子树的和,也就是最终答案。发现转移非常简单所以可以写成生成函数:\[F(u,i)=x^{[d_u\gei]}\prod_{(u,......
  • NC201985 立方数
    题目链接题目题目描述对于给定的正整数N,求最大的正整数A,使得存在正整数B,满足\(A^3B=N\)输入包含T组数据,1≤T≤10,000;\(1≤N≤10^{18}\)输入描述第一行数字T表示数据组数接下来一行,T个正整数N输出描述T行,每行一个数字表示答案示例1输入42724754输出3......
  • CSP-S 2019 笔试
    CSP-S2019笔试第6题没有重复数字的4位数,可选\(1,2,4,8\),方案数$A_4^4=24$有一对重复数字,可选\(1,1,2,4or1,1,2,8or1,1,4,8or8,8,2,4or8,8,2,1or8,8,1,4\),方案数$A_4^4/A_2^2\times6=72$有两对重复数字,可选\(1,1,8,8\),方案数$A_4^4/(A_2......
  • VisionPro C#混合编程环境搭建(基于VS2019)
    VisionPro工具分组(因为Vs2019导入VisionPro是全导入,为了方便,可以自建项进行分类)各选择项1VisionProToolEditControls2VisionProDisplayControls3VisionProShapeEditControls4VisionProSystemControls各选择项下的组件VisionProDisplayControls:CogRecor......
  • 2019年牛客普及模拟赛5
    字符统计:给出一个只包含空格和小写字母的字符串,问出现次数最多的字符(多个字符按照字典序输出)签到题。#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;intsum[250];charans[250];signedmain(){ //freopen("T1.in","r",stdin); //freopen("T1.out"......
  • 深度学习(十二)——神经网络:搭建小实战和Sequential的使用
    一、torch.nn.Sequential代码栗子官方文档:Sequential—PyTorch2.0documentation#UsingSequentialtocreateasmallmodel.When`model`isrun,#inputwillfirstbepassedto`Conv2d(1,20,5)`.Theoutputof#`Conv2d(1,20,5)`willbeusedastheinputto......
  • OS(二十二):设备管理之磁盘存储器管理
    1、数据的组织和格式1.1、磁盘驱动器的结构磁盘设备包括一个或多个物理盘片,每个磁盘片分一个或两个存储面(surface)。 1.2、磁盘的数据布局每个磁盘面被组织成若干个同心环,这种环被称为磁道(track),各磁道之间留有必要的间隙。 为使处理简单,每条磁道上可存储......
  • OS(十二):文件管理之文件的逻辑结构
    文件存在两种形式的结构:逻辑结构:又称为文件组织,用户角度的文件组织形式,用户可直接处理数据及其结构,独立于文件的物理特性。物理结构:又称为文件的存储结构,值文件在外存上的存储组织形式。1、文件逻辑结构的类型文件逻辑结构分为两大类:有结构文件,也被称为记录式文......