AtCoder Tenka1 Programmer Contest D - Crossing【构造】

emmm…

这道题mayflyyh拿给我做的时候只会判有解无解…然后第二天下午突然想到可以直接放进去。


首先来讨论一下有解无解的情况 。

我们将集合视为点,公共元素作为边,转化为无向图,就成了 n n n条边完全图,所以由完全图的性质,若存在 k k k满足下式则有解,否则无解
n = k ∗ ( k − 1 ) 2 n=\frac{k*(k-1)}{2} n=2k(k1)

然后考虑放集合。

我们暴力将每个数放进集合中满足条件即可,看代码理解一下就好了…

#include 
#define pb push_back
using namespace std;

int n,m,cnt;

vectora[1000];

int main() {
	scanf("%d",&n);
	
	for(int i=1;i*(i-1)<=2*n;i++) if(i*(i-1)==n*2) m=i;
	
	if(!m) {
		puts("No");return 0;
	}
	
	puts("Yes");printf("%d\n",m);
	
	for(int i=1;i<=m;i++) for(int j=i+1;j<=m;j++) cnt++,a[i].pb(cnt),a[j].pb(cnt);
	
	for(int i=1;i<=m;i++) {
		printf("%d ",a[i].size());
		for(int j=0;j

你可能感兴趣的:(AtCoder)