New stories have yet to start
先考虑 \(k\) 为偶数。
假设有一条链,则答案显然是 \(2n-2\)。因此当 \(k\) 较小时,我们可以成链。那么当 \(k\) 较大呢?我们考虑往链上挂节点,首先我们先让链上的节点尽可能大,确保一定是先走链的。然后我们假设与链上连了 \(v\) 条边,显然贡献是 \(v^2+v\)。因此这样我们就可以构造出答案。
然后考虑 \(k\) 为奇数。
通过构造,我们发现 \(K=9\) 时无解,而 \(K=11\) 时有解,因此直接把 \(K=11\) 的状态接到 1 上就好了。
Code
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define LL long long
#define fi first
#define se second
int K;
vector<pair<int,int> > E;
int n,py;
void Make(int rest){
vector<int> node;
if(rest <= 63400){
n = rest / 2 + 1;
int u,v;
u = 1,v = n;
for(int i=1;i<n;i++){
E.push_back({u,v});
u = v;
v -- ;
}
}
else{
n = 31700;
rest -= 2 * (n - 1);
while(rest){
int x;
x = sqrt(rest);
while((x + 1) * (x + 2) <= rest) x ++ ;
while(x * (x + 1) > rest) x -- ;
node.push_back(x);
n ++ ;
rest -= x * (x + 1);
}
int u,v;
u = 1,v = n;
for(int i=1;i<31700;i++){
E.push_back({u,v});
u = v;
v -- ;
}
for(int i=0;i<node.size();i++){
int len = node[i];
int u = i + 2;
int v = n;
for(int j=1;j<=len;j++){
E.push_back({u,v});
v -- ;
}
}
}
}
int main(){
IOS;
cin >> K;
if(K % 2 == 0){
Make(K);
}
else{
if(K <= 9){
cout << -1 << " " << -1;
return 0;
}
py = 3;
K -= 11;
Make(K);
for(int i=0;i<E.size();i++){
if(E[i].fi != 1) E[i].fi += py;
if(E[i].se != 1) E[i].se += py;
}
n += 3;
E.push_back({1,2});
E.push_back({1,3});
E.push_back({2,3});
E.push_back({2,4});
}
cout << n << " " << E.size() << "\n";
for(pair<int,int> e: E){
cout << e.fi << " " << e.se << "\n";
}
return 0;
}

浙公网安备 33010602011771号