码迷,mamicode.com
首页 > 其他好文 > 详细

1283F

时间:2020-01-27 23:31:33      阅读:353      评论:0      收藏:0      [点我收藏+]

标签:价值   std   scanf   event   节点   erase   max   main   col   

贪心

一条边的价值肯定大于其子树里边的价值 那么先将叶子节点对应的边放进一个$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\n", a[1]);
    for(int i = n - 2; ~i; --i) {
        printf("%d %d\n", ans[i].first, ans[i].second);
    }
    return 0;
}
View Code

 

1283F

标签:价值   std   scanf   event   节点   erase   max   main   col   

原文地址:https://www.cnblogs.com/19992147orz/p/12237192.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!