专栏文章
题解:AT_arc207_b [ARC207B] Balanced Neighbors 2
AT_arc207_b题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minjdf6v
- 此快照首次捕获于
- 2025/12/02 03:22 3 个月前
- 此快照最后确认于
- 2025/12/02 03:22 3 个月前
题意
构造一个无向图 ,,使 ,均满足:
其中,, 表示顶点 和 在图 中的最短路径距离。
思路
分类讨论奇数和偶数。
-
偶数先以 举例。考虑构造出一个完全图:

令 为编号和, 为每个点的答案,(每个点都可以通过一步走到其他点)。
发现 ,是一个固定的值,只要保证 和 的值相同,所有的 就相同,也就是要求在构造出来的图中, 和 不能在两步之内联通即可。
把点 和点 称为对应点。
考虑构造一个二分图, 为左部点, 为右部点:

之后对每个左部点和右部点连边(对应点除外):

构造后发现,每个左部点都可以用一步到达所有右部点(对应点除外),右部点同理。所以每个点 都可以在两步之内走到除对应点之外的所有点。
此时 。
-
奇数在偶数的基础上拓展。以 为例。

点 已经按照偶数的规律排好,此时 ,,只要把 向一侧的所有点连边,此时 ,满足题意。

综上:偶数时将左部点连向所有不对应的右部点,奇数时多出的一个点向一侧的所有点连边即可。
时间复杂度:。
代码
CPP#include<bits/stdc++.h>
#define int long long
#define bug cout<<"___songge888___"<<'\n';
using namespace std;
int n;
vector<pair<int,int> >ans;
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
if(n<=5){
cout<<-1;
}
else if(n%2==0){
for(int i=1;i<=n/2;i++){
for(int j=1;j<=n/2;j++){
int x=i*2-1;
int y=j*2;
if(x+y==n+1){
continue;
}
ans.push_back({x,y});
// cout<<x<<' '<<y<<'\n';
}
}
cout<<ans.size()<<'\n';
for(auto [x,y]:ans){
cout<<x<<' '<<y<<'\n';
}
}
else{
n--;
for(int i=1;i<=n/2;i++){
for(int j=1;j<=n/2;j++){
int x=i*2-1;
int y=j*2;
if(x+y==n+1){
continue;
}
ans.push_back({x,y});
// cout<<x<<' '<<y<<'\n';
}
}
for(int i=1;i<=n/2;i++){
ans.push_back({i*2-1,n+1});
// cout<<i<<' '<<n+1<<'\n';
}
cout<<ans.size()<<'\n';
for(auto [x,y]:ans){
cout<<x<<' '<<y<<'\n';
}
}
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...