1283F

Posted 19992147orz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1283F相关的知识,希望对你有一定的参考价值。

贪心

一条边的价值肯定大于其子树里边的价值 那么先将叶子节点对应的边放进一个$set$ 从后往前扫 每次选$set$里最小的配对 如果出现新的叶子加入$set$ 每条边的价值就是自己以及子树中最大的编号 

有点类似超级钢琴的贪心 不过简单很多

技术图片
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5;
int n;
int d[maxn], a[maxn], dp[maxn];
int main() {
    scanf("%d", &n);
    for(int i = 1; i < n; ++i) {
        scanf("%d", &a[i]);
        ++d[a[i]];
    }
    set<pair<int, int> > s;
    for(int i = 1; i <= n; ++i) {
        dp[i] = i;
        if(!d[i]) {
            s.insert(make_pair(i, i));
        }
    }
    vector<pair<int, int> > ans;
    for(int i = n - 1; i; --i) {
        if(s.empty()) {
            puts("-1");
            return 0;
        }
        auto o = *s.begin();
        s.erase(s.begin());
        dp[a[i]] = max(dp[a[i]], o.first);
        ans.emplace_back(a[i], o.second);
        if(!--d[a[i]]) {
            s.insert(make_pair(dp[a[i]], a[i]));
        }
    }
    printf("%d
", a[1]);
    for(int i = n - 2; ~i; --i) {
        printf("%d %d
", ans[i].first, ans[i].second);
    }
    return 0;
}
View Code

 

以上是关于1283F的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数