[CF1214E] Petya and Construction Set

给你 (d_i (le n)),要求你构造一棵树满足点 (2i)(2i-1) 距离为 (d_i)

Solution

关键在于这个神奇的 (d leq n)

按照 (d_i) 从大到小排序,并且将所有奇数点串成一条链

依次考虑每个偶数点挂在哪里

对于链上第 (k) 个点,它的偶数点应该被挂在 (k+d_i-1) 个点的下面

如果第 (k+d_i-1) 是链上最后一个点,就需要再挂一个点来进行扩充

可以证明被挂的点一定存在

#include <bits/stdc++.h>
using namespace std;

const int N=100005;
pair<int,int> d[N];
int n,cnt,id[N];

signed main() {
    cin>>n;
    for(int i=1;i<=n;i++) cin>>d[i].first, d[i].first*=-1, d[i].second=i;
    sort(d+1,d+n+1);
    for(int i=1;i<=n;i++) {
        if(i<n) cout<<2*d[i].second-1<<" "<<2*d[i+1].second-1<<endl;
        int x=i-d[i].first-1;
        if(x<=n) cout<<2*d[x].second-1<<" "<<2*d[i].second<<endl;
        else cout<<id[x-n]<<" "<<2*d[i].second<<endl;
        if(x-n==cnt) id[++cnt]=2*d[i].second;
    }
}

原文地址:https://www.cnblogs.com/mollnn/p/12567674.html