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

浙公网安备 33010602011771号