[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;
    }
}

猜你喜欢

转载自www.cnblogs.com/mollnn/p/12567674.html
今日推荐