cf1214 E. Petya and Construction Set

题意:

构造一棵节点数为 2n 的树. 给出 n 个范围在 [1, n] 的正整数 di. 你构造出来的树需要满足: 第 2i - 1 个点与第 2i 个点在树上的距离恰为 di

距离即路径上的边数

思路:

每对点之间是独立的。

从大到小考虑 di,先构造一条有 n 个节点的链,把所有偶数号点放上去。

从左到右看每个偶数点,对应的奇数配对点要么在链中间往旁边伸一片叶子,要么接在链尾之后并使链长+1

const signed N = 2e5 + 3;
int n; PII a[N]; //d,id
signed main() {
    iofast;
    cin >> n;
    for(int i = 1; i <= n; i++)
        cin >> a[i].fi, a[i].se = i*2;

    sort(a + 1, a + 1 + n, greater<PII>());

    for(int i = 1; i < n; i++)
        cout << a[i].se << ' ' << a[i+1].se << endl;

    for(int i = 1, ed = n; i <= n; i++)
        if(i + a[i].fi > ed)
            cout << a[ed].se << ' ' << a[i].se-1 << endl,
            a[++ed] = {0, a[i].se-1};
        else cout << a[i+a[i].fi-1].se << ' ' << a[i].se-1 << endl;
}

posted @ 2022-04-16 21:58  Bellala  阅读(25)  评论(0)    收藏  举报