专栏文章
题解:AT_arc207_b Balanced Neighbors 2
AT_arc207_b题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @minojw1w
- 此快照首次捕获于
- 2025/12/02 05:47 3 个月前
- 此快照最后确认于
- 2025/12/02 05:47 3 个月前
题意
构造一个 个点的简单连通无向图,使得每个顶点能在两步之内到达的顶点编号(不包含自己)之和均相等。
思路
本题充分考察了瞪眼法的解题方法。
首先通过跑一遍样例输出可以发现对于 ,点 可以到达除了 的所有点,点 可以到达除了 的所有点,点 可以到达除了 的所有点,以此类推。
于是我们猜测,对于 为偶数,我们构造的方案应该是能让点 能到达除了点 的所有点,这样可以保证每个点的编号和都为 。
如果你尝试从样例观察出更多性质(如观察出构造方法),那么恭喜你,样例确实有一定的构造方法,但是是有关 的特殊解法,而通过提交后 WA 了我们可以知道对于大于一定范围的偶数 应该是都有解的。我们需要考虑去构造通解。
首先我们需要求出有解的范围。通过朴素暴力(复杂度为 ,可以跑到 )或者手模可以发现对于 都是无解的,而对于 存在以下解:

对于 存在以下解:

其实通过这两个图已经可以观察出正解了。
先不考虑 为奇数的情况。可以发现在 中,点 和 可以看作中间隔了两层点,因此不能在两步以内到达。而 和 , 和 之间没有连边,因此点 最多只能通过两步到达本层的点或者另一边除了 的点。
如果你还没有发现,可以再手模一个 的情况:

发现了吧。同样的,点 和 之间隔了两层顶点,两层之间的点 和 之间没有 和 的连边。
因此, 为偶数的构造方法即为:
取出点 和点 ,将点 与 连边,将点 与 连边,对于 和 之间将所有和不为 的点连边。
如果你现在就交的话,你会发现你还是挂了恰好一半的点。通过以上构造我们可以发现奇数应该也是有通解的。接下来考虑 为奇数的构造方法。
再来看这张 的图:

令 。可以发现,这种连边方式可以使得 能到达所有点,并且不会改变原来不可达的关系。因此 能到达的编号之和为 ( 为 自己的编号),而对于其他点,由于它们都能到达 ,所以它们不能到达的点仍然为 ,即能到达的编号之和也为 。
同样的,对于 :

因此, 为奇数的构造方法即为:
构造出 的偶数情况下的图,并将 与 和 连边。
代码
CPP#include<bits/stdc++.h>
using namespace std;
int n;
vector<pair<int,int>> a;
signed main(){
ios::sync_with_stdio(false);
cin.tie(),cout.tie();
cin>>n;
if(n<6){
cout<<-1;
return 0;
}
if(n%2==1){
a.push_back({n,1});
for(int i=n/2+1;i<=n-2;i++)
a.push_back({n,i});
n--;
}
for(int i=2;i<=n/2;i++)
a.push_back({1,i});
for(int i=n/2+1;i<=n-1;i++)
a.push_back({i,n});
for(int i=2;i<=n/2;i++)
for(int j=n/2+1;j<=n-1;j++)
if(i+j!=n+1) a.push_back({i,j});
cout<<a.size()<<endl;
for(pair<int,int> v:a) cout<<v.first<<" "<<v.second<<endl;
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...