首页 > 其他分享 >一本通金牌导航 分治法 E.工程划分 / P5290 [十二省联考 2019] 春节十二响(启发式合并)

一本通金牌导航 分治法 E.工程划分 / P5290 [十二省联考 2019] 春节十二响(启发式合并)

时间:2024-01-21 18:33:51浏览次数:41  
标签:puts 合并 十二 2019 权值 集合 include 联考 define

题目传送门

题意简述:将树上 \(n\) 个点划分为若干个集合,使得集合中的点两两没有祖孙关系。一个集合的权值是集合内点的权值的最大值,求所有集合的权值之和的最小值。

首先这题有个非常显然的贪心:将几个权值大的点尽可能的合并到一个集合中是更优的。

集合中的点两两没有祖孙关系,说明集合中的点是在几个不同的子树中取到的。考虑从树上底部往顶部合并。在每个节点上维护一个 堆/set 表示该子树内已经形成的集合(按集合权值从大到小排序)。

合并该节点的两个不同的儿子的堆时(显然分属两个儿子的子树中的点没有祖孙关系),不断的取出两个儿子的堆中最大值,将这两个集合合并为一个集合(根据前文的贪心可知此时为最优),然后再丢回去。

合并堆的时候采用启发式合并算法,时间复杂度是 \(O(n\log n)\) 的。

点击查看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
#include<bitset>
#include<set>
#include<ctime>
#include<random>
#define x1 xx1
#define y1 yy1
#define IOS ios::sync_with_stdio(false)
#define ITIE cin.tie(0);
#define OTIE cout.tie(0);
#define PY puts("Yes")
#define PN puts("No")
#define PW puts("-1")
#define P__ puts("")
#define PU puts("--------------------")
#define popc __builtin_popcount
#define pii pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define gc getchar
#define pc putchar
#define pb emplace_back
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define reprange(a,b,c,d) for(int a=b;a<=c;a+=d)
#define perrange(a,b,c,d) for(int a=b;a>=c;a-=d)
#define graph(i,j,k,l) for(int i=k[j];i;i=l[i].nxt)
#define lowbit(x) (x&-x)
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define mem(x,y) memset(x,y,sizeof x)
//#define double long double
#define int long long
//#define int __int128
using namespace std;
inline int rd(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
}
inline void write(int x,char ch='\0'){
	if(x<0){x=-x;putchar('-');}
	int y=0;char z[40];
	while(x||!y){z[y++]=x%10+48;x/=10;}
	while(y--)putchar(z[y]);if(ch!='\0')putchar(ch);
}
bool Mbg;
const int maxn=2e5+5,maxm=4e5+5,inf=0x3f3f3f3f;
const long long llinf=0x3f3f3f3f3f3f3f3f;
int n,a[maxn];
vector<int>G[maxn];
priority_queue<int>q[maxn],qq;
int num,num2;
void merge(priority_queue<int>&x,priority_queue<int>&y){
	if(x.size()<y.size())swap(x,y);
	while(!y.empty()){
		num=x.top(),num2=y.top();
		x.pop(),y.pop();
		qq.push(max(num,num2));
	}
	while(!qq.empty())x.push(qq.top()),qq.pop();
}
void dfs(int x){
	for(int u:G[x])dfs(u),merge(q[x],q[u]);
	q[x].push(a[x]);
}
void solve_the_problem(){
	n=rd();
	rep(i,1,n)a[i]=rd();
	rep(i,2,n){int x=rd();G[x].pb(i);}
	dfs(1);
	int ans=0;
	while(!q[1].empty())ans+=q[1].top(),q[1].pop();
	write(ans);
}
bool Med;
signed main(){
	int _=1;while(_--)solve_the_problem();
}
/*

*/

标签:puts,合并,十二,2019,权值,集合,include,联考,define
From: https://www.cnblogs.com/dcytrl/p/17978131

相关文章

  • [省选联考 2020 A 卷] 组合数问题(斯特林数)
    题面计算\[\left(\sum_{k=0}^{n}f(k)\timesx^k\times\binom{n}{k}\right)\bmodp\]的值。思路因为模数为合数,不能求逆元,要把组合数的分母消掉。\(x^k\)似乎不能做什么,\(f(k)\)的操作空间似乎很大首先将\(f(k)=\sum_{i=0}^{m}a_ix^i\)转化为\(f(k)=\sum_{i=0}^{m}b_ix^......
  • 题解 P6226 [BalticOI 2019 Day1] 潜艇
    【洛谷博客】题解P6226[BalticOI2019Day1]潜艇题意很清楚,忽略。分析看到这种字符串题很容易想到直接广度优先搜索,复杂度\(O(rc4^m)\)。很显然承受不了,所以考虑DP。状态设计设\(f_{i,x,y}\)表示执行完前\(i\)个操作后位置\((x,y)\)能否作为终点。设命令字符......
  • Petrozavodsk Summer 2019. Day 9. MEX Foundation Contest【杂题】
    比赛链接A.TheOnePolynomialMan给定模数\(p\)和\(0\simp-1\)的两个集合\(U,V\),求有多少个有序对\((a,b)\)满足:\(f(a,b)=\prod\limits_{z\inV}\left(\frac{(2a+3b)^2+5a^2}{(3a+b)^2}+\frac{(2a+5b)^2+3b^2}{(3a+2b)^2}-z\right)\equiv0\pmo......
  • CCPC-final 2019 Problem B - Infimum of Paths
    链接参考题解题意:求0->1路径上的数组成真小数最小值若最小路径无环,则长度\(\le\)n-1方法一从\(0\)开始,维护当前走到的点,每次都走边权(当前总体)最小的且\(v\)能到\(1\)的边,跑\(2n\)条边,顺便沿路维护走过的边权连\(1\rarr1\)代价为\(0\)的环,这样最后一定是在环......
  • 12星座 十二属相
    十二生肖和十二星座的关系,哪个更准?大美临洮2023-06-2218:03甘肃十二生肖和十二星座都是人类文化传统中非常重要的元素,这两个概念与占星术、命理学等相关联。然而,讨论哪个更准确可能会有一些争议,因为它们各自具有不同的起源和性质。在本文中,我们将探讨什么是十二生肖......
  • [极客大挑战 2019]Knife 1
    [极客大挑战2019]Knife1审题没啥好审的,给出eval($_POST["Syc"]);一句话木马了知识点蚁剑连接一句话木马。做题蚁剑连接测试成功后打开找到flag。......
  • Windows 2016 2019 显示桌面图标
    运行cmd窗口输入命令rundll32.exeshell32.dll,Control_RunDLLdesk.cpl,,0弹出桌面图标设置窗口作者:VipSoft......
  • 《c++dll篇》VS2019生成dll及调用
    VS2019生成dll及调用生成DLL1.创建dll工程2.编写dll函数经过上述过程后工程中会生成几个自带的文件,可以自行创建或者更名,我直接在上面进行编写了。如下我先在pch.h中创建我需要调用函数的声明,他们分别用于实现加法和取最大值的功能,你可以根据自己的需求更改成自己的子程序。......
  • 2019 CSP-J
    2019CSP-JP5660数字游戏(语法)题意给定一个长度最大为\(8\)的01字符串,求字符串中有多少个\(1\)。题解#include<bits/stdc++.h>usingnamespacestd;/*====================*/#defineendl"\n"/*====================*/typedeflonglonglnt;/*===================......
  • 2019 CSP-J 江西
    2019CSP-J江西P5681面积(语法)题意求出边长为\(a\)的正方形与长宽分别为\(b,c\)的矩形哪一个面积更大。题解#include<bits/stdc++.h>usingnamespacestd;/*====================*/#defineendl"\n"/*====================*/typedeflonglonglnt;/*===========......