【Codeforces 827B】High Load
【链接】 我是链接,点我呀:)
【题意】
【题解】
树的最长链是一定会经过两个叶子节点的。 我们可以构造一棵树,让最后的最长链一定是由经过根节点的两条链组成。 然后让这两条链的长度尽可能短就好。 那么创建k个叶子节点,然后从左往右依次加上去就好,即让每一条叶子节点到根节点的路径都竟可尽可能短(平均分配剩余的n-k-1个节点) (直接除k输出应该也问题不大。)【代码】
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5;
int n,k;
int a[N+10],cnt[N+10];
vector<pair<int,int> >v;
int main()
{
ios::sync_with_stdio(0),cin.tie(0);
cin >> n >> k;
for (int i = 1;i <= k;i++) a[i] = i;
for (int i = k+1;i <= n-1;i++){
v.push_back(make_pair(a[i%k+1],i));
a[i%k+1] = i;
cnt[i%k+1]++;
}
sort(cnt+1,cnt+1+k);
int ans = cnt[k]+cnt[k-1]+2;
for (int i = 1;i <= k;i++){
v.push_back(make_pair(a[i],n));
}
cout<<ans<<endl;
for(int i = 0;i < (int)v.size();i++){
int x = v[i].first;int y = v[i].second;
cout<<x<<" "<<y<<endl;
}
return 0;
}