专栏文章
题解:CF2162G Beautiful Tree
CF2162G题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mindjnga
- 此快照首次捕获于
- 2025/12/02 00:39 3 个月前
- 此快照最后确认于
- 2025/12/02 00:39 3 个月前
简要说明题意:
给出 ,构造一棵含 个节点的树。一条边 的权为 ,要求树的边权之和是一个完全平方数。
题目分析:
想构造的方便一点,那我们构造的值最好是一个和 有关的东西。由于 ,所以想到把奇数和偶数分成两堆,大于 的偶数和 连接,大于 的奇数和 连接。
至于为什么不是奇数和 ,偶数和 ,我一开始也是这么构造的,式子会麻烦一些。 :(
为偶数时,奇数偶数个数相等, 为奇数时,奇数比偶数多 ,式子会不一样,分开讨论。
偶数
记 ,这个森林的和是 。
那我们连接 (还可以把两棵树连起来),配凑一个 ,得到 ,再将 改为 ,得到了一个和为 的构造。
奇数
记 ,和为 。
连接 得到 ,同理将 改为 ,得到一个和为 的构造。
然后注意一下
corner case。偶数
应该是
-1。,即 时, 会和 重复。
,即 时, 会成环。
奇数
同理,需要单独构造一下 。
梳理后感觉构造过程并不复杂,可是半夜做题让我多花了很多时间计算和查错。:(
代码如下:
CPP#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int T,n;
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
cin>>T;
while(T--){
cin>>n;
if(n==2){
cout<<"-1\n";
continue;
}
if(n==6){
cout<<"1 2\n";
cout<<"1 3\n";
cout<<"1 5\n";
cout<<"1 6\n";
cout<<"4 5\n";
continue;
}
if(n==8){
cout<<"1 2\n";
cout<<"1 3\n";
cout<<"1 4\n";
cout<<"1 5\n";
cout<<"1 6\n";
cout<<"1 8\n";
cout<<"3 7\n";
continue;
}
if(n==10){
cout<<"1 2\n";
cout<<"1 3\n";
cout<<"1 4\n";
cout<<"1 5\n";
cout<<"1 6\n";
cout<<"1 7\n";
cout<<"1 8\n";
cout<<"1 9\n";
cout<<"2 10\n";
continue;
}
if(!(n&1)){
cout<<(n>>1)-1<<' '<<(n>>1)<<'\n';
cout<<"2 4\n";
for(int i=6;i<=n;i+=2) cout<<"1 "<<i<<'\n';
for(int i=3;i<=n;i+=2) cout<<"2 "<<i<<'\n';
continue;
}
if(n==3){
cout<<"1 3\n";
cout<<"2 3\n";
continue;
}
if(n==5){
cout<<"1 3\n";
cout<<"2 3\n";
cout<<"3 4\n";
cout<<"3 5\n";
continue;
}
if(n==7){
cout<<"1 2\n";
cout<<"1 4\n";
cout<<"1 5\n";
cout<<"1 6\n";
cout<<"1 7\n";
cout<<"3 4\n";
continue;
}
if(n&1){
cout<<((n+1)>>1)<<' '<<((n+1)>>1)+1<<'\n';
cout<<"2 4\n";
for(int i=6;i<=n;i+=2) cout<<"1 "<<i<<'\n';
for(int i=3;i<=n;i+=2) cout<<"2 "<<i<<'\n';
continue;
}
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...