Problem - C - Codeforces
题意:
有1~2*n的一个排列,进行数与数之间两两匹配,问如何组合可以使n个 数对 ai+bi排列起来是一个连续序列,如果无解输出No
思路:
构造题,考虑将构造的条件特殊化
手推样例可知,它大概是1和2*n匹配,然后3和2*n-1匹配,....,这样的和就是+2-1,直到n和....匹配,然后考虑从2,4,6开始匹配,本质上就是找规律
Code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mxn=2e5+10;
int N;
int vis[mxn];
void solve(){
cin>>N;
if(N%2==0){
cout<<"NO"<<'\n';
return;
}
cout<<"YES"<<'\n';
for(int i=1;i<=N*2;i++) vis[i]=0;
int l=1,r=N*2;
while(l<=r&&l<=N){
cout<<l<<" "<<r<<'\n';
vis[l]=vis[r]=1;
l+=2,r--;
}
l=1;r=N*2;
while(l<=r&&l<=N*2&&r>=1){
while(vis[l]) l++;
while(vis[r]) r--;
if(l<=N*2&&r>=1){
cout<<l<<" "<<r<<'\n';
vis[l]=vis[r]=1;
}
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;cin>>__;
while(__--)solve();return 0;
}
/*YES
1 18
3 17
5 16
7 15
9 14
11 13
2 12
4 10
6 8*/