Luogu P5290 / LOJ3052 【[十二省联考2019]春节十二响】
联考Day2T2...多亏有这题...让我水了85精准翻盘进了A队...
题目大意:
挺简单的就不说了吧...(这怎么简述啊)
题目思路:
看到题的时候想了半天,不知道怎么搞。把样例画到演草纸上之后又画了几条链手动找最优解,然后发现只需要知道怎么合并子树就行了。因为题目说的很清楚,合并出来链就行,然后手动模拟了一下合并,由于有父子关系的两个点不能被合并在一起,那么从最优的角度考虑显然贪心,把其他链中的最大与当前链最大取\(\max\),第二大同理,以此类推。那么显然需要一个堆维护,然后考虑合并后的链长度,显然是以\(1\)为一个端点的最长链长。由此很容易想到树剖,先求出重链,然后把轻链合并到重链上。然而考场上蠢了,拿vector维护了链,插入数的时候插入到vector末尾然后暴力swap,结果一条链的时候T了,非常GG。
所以这题真的非常简单,就树剖之后暴力合并,实现细节详见代码qwq(所以要不是因为蠢了就直接A了)
ps:考试的时候写到namespace里面了,然后并不想再改太多,就这样写了,凑合着看一下好了qwq。(这题真的水 就连数据都是水的)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<queue>
using namespace std;
void qread(int &xx){
xx=0;int ch=getchar();
while(ch<'0'||ch>'9'){
ch=getchar();
}
while(ch>='0'&&ch<='9'){
xx=xx*10+ch-'0';
ch=getchar();
}
}
const int N=2e5+5;
int n,M[N],f[N],mxlen[N],lson[N];
vector<int>G[N];
namespace sub1{
void pdfs(int u){
if(!u){
return;
}
for(int v,i=0;i<(int)G[u].size();i++){
v=G[u][i];
pdfs(v);
mxlen[u]=max(mxlen[u],mxlen[v]+1);
}
for(int v,i=0;i<(int)G[u].size();i++){
v=G[u][i];
if(mxlen[v]==mxlen[u]-1){
lson[u]=v;
break;
}
}
mxlen[u]=max(mxlen[u],1);
}
void dfs(int u,priority_queue<int>&pq){
if(!u){
return;
}
if(lson[u]){
dfs(lson[u],pq);
}
else{
pq.push(M[u]);
return;
}
priority_queue<int>rep,repp;
for(int v,i=0;i<(int)G[u].size();i++){
v=G[u][i];
if(v==lson[u]){
continue;
}
dfs(v,rep);
while(!rep.empty()){
repp.push(max(pq.top(),rep.top()));
pq.pop();
rep.pop();
}
while(!repp.empty()){
pq.push(repp.top());
repp.pop();
}
}
pq.push(M[u]);
}
void solve(){
long long rep=0;
priority_queue<int>ans;
pdfs(1);
dfs(1,ans);
while(!ans.empty()){
rep+=ans.top();
ans.pop();
}
printf("%lld\n",rep);
}
}
void addedge(int u,int v){
G[u].push_back(v);
}
int main(){
qread(n);
for(int i=1;i<=n;i++){
qread(M[i]);
}
for(int i=2;i<=n;i++){
qread(f[i]);
addedge(f[i],i);
}
sub1::solve();
return 0;
}
Luogu P5290 / LOJ3052 【[十二省联考2019]春节十二响】的更多相关文章
- P5290 [十二省联考2019]春节十二响
题目地址:P5290 [十二省联考2019]春节十二响 骗分方法 如果你实在一点思路也没有,暴力都不会打,那么请考虑一下骗分. 方法一 输出所有 \(M\) 的和. 期望得分:0分. 实际还有5分 方 ...
- P5290 [十二省联考2019]春节十二响(堆+启发式合并)
P5290 [十二省联考2019]春节十二响 从特殊到一般 我们先看链的情况. 我们把点$1$左右的两条子链分别扔入堆里 每次取出两个堆的最大值,把答案累加上更大的那个(另一堆为空则直接加上去). 那 ...
- 【堆的启发式合并】【P5290】[十二省联考2019]春节十二响
Description 给定一棵 \(n\) 个节点的树,点有点权,将树的节点划分成多个集合,满足集合的并集是树的点集,最小化每个集合最大点权之和. Limitation \(1~\leq~n~\le ...
- Luogu P5290 [十二省联考2019]春节十二响
这题是最近看到的今年省选题中最良心的一道了吧 看题+想题+写题都可以在0.5h内解决,送分含义明显啊 首先理解了题意后我们很快就能发现两个点如果要被分在一段那么必须在它们的祖先处合并 首先我们考虑下二 ...
- luogu P5290 [十二省联考2019]春节十二响 优先队列_启发式合并
思维难度不大,在考上上写的启发式合并写错了,只拿了 60 pts,好难过QAQ 没什么太难的,在考场上想出链的部分分之后很容易就能想到正解.没错,就是非常短的启发式合并.注意一下,写的要漂亮一点,否则 ...
- 【题解】Luogu P5290 [十二省联考2019]春节十二响
原题传送门 每个点维护一个堆,表示这个点及其子树所需的每段内存的空间 搜索时从下向上做启发式合并堆中信息,最后根节点堆中所有内存空间之和就是答案 #include <bits/stdc++.h& ...
- [LOJ3052] [十二省联考 2019] 春节十二响
题目链接 LOJ:https://loj.ac/problem/3052 洛谷:https://www.luogu.org/problemnew/show/P5290 BZOJ:https://www ...
- Luogu5290 十二省联考2019春节十二响(贪心+启发式合并)
考虑链的做法,显然将两部分各自从大到小排序后逐位取max即可,最后将根计入.猜想树上做法相同,即按上述方式逐个合并子树,最后加入根.用multiset启发式合并即可维护.因为每次合并后较小集合会消失, ...
- LuoguP5290 [十二省联考2019]春节十二响 | 启发式合并
还有33天就要高考了,我在干啥-- 题目概述 一棵有根树,每个节点有权值. 要求把所有节点分成组,具有祖先-后代关系的两个节点不能被分到同一组. 每一组的代价是所包含的节点的最大权值,最小化所有组的代 ...
随机推荐
- MySQL 使用左连接替换not in
众所周知,左连接和右连接的含义是以哪一张表为准. 左连接就是以左表为准,查出的结果中包含左表所有的记录,如果右表中没有与其对应的记录,那么那一行记录中B表部分的内容就全是NULL. 现在有两个表,一个 ...
- JS 验证输入框输入 只允许输入正实数(正整数,正小数),其他情况下不能输入 oninput事件
input标签的oninput事件 要求输入框只输入正实数,包括整数和小数. 具体要求:整数部分不超过7位,可以没有小数,若有位数不超过2位. <input type="text&qu ...
- 剑指offer(19)二叉树中和为某一值的路径
题目: 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.(注意: 在返回值的list中,数组长度大的 ...
- Java 线程的创建和启动
Java 使用 Thread 类代表线程,所有的线程对象都必须是 Thread 类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流(一段顺序执行的代码). Java 使用线程执 ...
- IntelliJ IDEA启动Tomcat后,却无法访问Tomcat主页 等一系列问题
1.IntelliJ IDEA启动Tomcat后,却无法访问Tomcat主页 转:http://www.myexception.cn/other/1998827.html https://blog.c ...
- Android——线程通讯 Handler、Looper、Message;
线程通讯问题 (主要用到了Handler类,Looper类和Message类以及MessageQueue) 在Android中主线程如何向子线程中发送消息的问题.让我们来想想,这其中的过程,无非就是创 ...
- python爬虫scrapy之如何同时执行多个scrapy爬行任务
背景: 刚开始学习scrapy爬虫框架的时候,就在想如果我在服务器上执行一个爬虫任务的话,还说的过去.但是我不能每个爬虫任务就新建一个项目吧.例如我建立了一个知乎的爬行任务,但是我在这个爬行任务中,写 ...
- Centos6.8 安装git
1.下载安装包 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.8.0.tar.gz 2.安装依赖 sudo yum - ...
- Linux的基础命令, django的安装与使用
一. Linux一些基础指令 cat命令, 用于查看纯文本文件(常用于内容较少的) cat 校花的故事.txt # 查看文件 cat -n 校花的故事.txt # 查看文件并显示行号 -n 显示行号 ...
- Percona-xtrabackup 使用详解与原理
现在有个需求需要对使用 innodb 的数据库进行热备.网上查了很多工具皆推荐 Percona-xtrabackup 于是就仔细了解调研一番. 我们可以前往 https://www.percona.c ...