AtCoder Grand Contest 032 B - Balanced Neighbors(构造)
题目链接
题意:
给定一个整数 n n n ,试构造一个节点数为 n n n无向图。令节点编号为 1... n 1...n 1...n ,要求其满足以下条件:
- 这是一个简单连通图。
- 存在一个整数 s s s 使得对于任意节点,与其相邻节点的下标和为 s s s 。
保证输入数据有解。
题解:
对 n n n 进行奇偶讨论。
1. 1. 1. 若 n n n 为偶数,我们把 n n n 量两两配对,分成 n / 2 n/2 n/2 对,分别为 ( 1 , n ) ( 2 , n − 1 ) ( 3 , n − 2 ) . . . . (1,n) (2,n-1) (3,n-2).... (1,n)(2,n−1)(3,n−2).... ,每一对的两个点不建边,只与其他对的点建边,那么会发现,每个点的相邻点下标之和就为 ( n / 2 − 1 ) ⋅ ( n + 1 ) (n/2-1) \cdot (n+1) (n/2−1)⋅(n+1) 。
2. 2. 2. 若 n n n为奇数 ,我们把 n n n单独拿出来, ( n ) ( 1 , n − 1 ) ( 2 , n − 2 ) ( 3 , n − 3 ) . . . (n) (1,n-1) (2,n-2) (3,n-3)... (n)(1,n−1)(2,n−2)(3,n−3)... 剩下的操作就和偶数是一样的。
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
#include<set>
#include<ctime>
#define iss ios::sync_with_stdio(false)
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair<int,int>pii;
const int MAXN=2e5+5;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
struct node
{
int a,b;
}f[MAXN];
int cnt=0;
std::vector<pii> v;
void add(int i,int j){
v.push_back({f[i].a,f[j].a});
v.push_back({f[i].a,f[j].b});
v.push_back({f[i].b,f[j].a});
v.push_back({f[i].b,f[j].b});
}
int main()
{
int n;
cin>>n;
if(n&1){
for(int i=1;i<=n/2;i++){
f[++cnt].a=i;
f[cnt].b=n-i;
}
for(int i=1;i<=cnt;i++){
v.push_back({n,f[i].a});
v.push_back({n,f[i].b});
}
for(int i=1;i<=cnt;i++){
for(int j=i+1;j<=cnt;j++){
add(i,j);
}
}
}
else{
for(int i=1;i<=n/2;i++){
f[++cnt].a=i;
f[cnt].b=n-i+1;
}
for(int i=1;i<=cnt;i++){
for(int j=i+1;j<=cnt;j++){
add(i,j);
}
}
}
cout<<v.size()<<endl;
for(int i=0;i<v.size();i++){
cout<<v[i].first<<" "<<v[i].second<<endl;
}
}