题解:AT_arc207_b Balanced Neighbors 2
题意
构造一个
思路
本题充分考察了瞪眼法的解题方法。
首先通过跑一遍样例输出可以发现对于
于是我们猜测,对于
如果你尝试从样例观察出更多性质(如观察出构造方法),那么恭喜你,样例确实有一定的构造方法,但是是有关 提交后 WA 了我们可以知道对于大于一定范围的偶数
首先我们需要求出有解的范围。通过朴素暴力(复杂度为
对于
其实通过这两个图已经可以观察出正解了。
先不考虑
如果你还没有发现,可以再手模一个
发现了吧。同样的,点
因此,
取出点
如果你现在就交的话,你会发现你还是挂了恰好一半的点。通过以上构造我们可以发现奇数应该也是有通解的。接下来考虑
再来看这张
令
同样的,对于
因此,
构造出
代码
#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;
}