题解:CF2120C Divine Tree
题面
link
题解
先确定无解情况,要求的答案最小情况下是
考虑简化问题直接构造一条链。不妨先给每个点分发一个 divineness 为
分发的过程是先尝试给每个点分一个
分配完 divineness 之后给所有
然后显然根节点必须是
Code
const int N = 1e6 + 5;
ll a[N];
void GOGOGO() {
ll n = rd(), m = rd(), ac = 0;
if (m < n || m > n*(n+1)/2) {cout << "-1\n"; return;}
F(i, 1, n) { // 分配权值
if (m > n - i + 1) m -= n - i + 1, a[++ac] = i;
else {
F(j, i, n - m) a[++ac] = i-1;
F(j, n - m + 1, n) a[++ac] = i;
break;
}
}
ll rub = a[n] + 1, pre = a[n]; // rub 是 “垃圾桶”
cout << a[n] << '\n';
D(i, n-1, 1) {
if (a[i] == a[i+1]) cout << pre << ' ' << (pre = rub++) << '\n';
else cout << pre << ' ' << (pre = a[i]) << '\n';
}
}