New stories have yet to start

CF2045L

先考虑 \(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;
}
posted @ 2026-09-16 19:36  WinterXorSnow  阅读(5)  评论(0)    收藏  举报