Description
给出一整数nn,考虑以下四条线段上的个整点:
1.0≤x<n,y=00≤x<n,y=0
2.0≤x<n,y=n−10≤x<n,y=n−1
3.x=0,0≤y<nx=0,0≤y<n
4.x=n−1,0≤y<nx=n−1,0≤y<n
要求构造nn条不平行于坐标轴的直线,使得每条直线经过这个整点中的两个且这些直线的交点尽可能多,从(0,0)(0,0)开始逆时针给这4n−44n−4个整点编号为0,1,...,4n−50,1,...,4n−5,输出每条直线经过的两个整点的编号
Input
第一行一整数TT表示用例组数,每组用例输入一整数
Output
输出2n2n个整数表示这nn条直线经过的点的编号
Sample Input
3
2
3
4
Sample Output
0 2 1 3
1 4 2 5 3 6
0 6 1 9 3 8 4 10
Solution
构造题,以点连向n+in+i构造n−1n−1条直线(0≤i<n−1)(0≤i<n−1),再从右下角n−1n−1连向左上角3⋅(n−1)3⋅(n−1)旁边的3n−43n−4或3n−23n−2即可,可以证明任意三点不共线,这样的nn条直线的交点必然最多,注意时特判
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=100001;
vector<int>ans;
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
if(n==2)printf("0 2 1 3\n");
else
{
for(int i=0;i<n-1;i++)printf("%d %d ",i,n+i);
printf("%d %d\n",n-1,3*(n-1)-1);
}
}
return 0;
}