题解:CF1948E Clique Partition
首先,观察到题目中两点连边的条件为
那么,建立平面直角坐标系,对于每一个点,以下标
接着,根据曼哈顿距离的性质,与坐标
其次,要使一块区域每一个点都可以这样覆盖其它所有点,这些点就必须保证都在以下黑色区域内:
黑色区域就是能互相形成团的坐标范围,在这个区域内所有的点都可以构成同一个团,所以我们只需在这个区域内填入尽量多的点使所有点的横纵坐标均不同。
这个区域的对角线长度是
(放置方式多种多样,只要保证区域内点的横纵坐标均不相同即可。)
这样,将点每连续
时间复杂度
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=45;
int ans[N],bel[N];
int main()
{
int T; scanf("%d",&T);
while(T--)
{
int n,k; scanf("%d%d",&n,&k);
int idx=0,part=0;
for(int l=1;l<=n;l+=k)
{
part++;
int r=min(n,l+k-1);
int mid=l+r>>1;
for(int i=mid+1;i<=r;i++)
ans[i]=++idx,bel[i]=part;
for(int i=l;i<=mid;i++)
ans[i]=++idx,bel[i]=part;
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
putchar('\n');
printf("%d\n",part);
for(int i=1;i<=n;i++)
printf("%d ",bel[i]);
putchar('\n');
}
return 0;
}