题目传送门
思路:
构造乱搞题……
对于已经有
n
n
n 个点无向完全图,我们考虑最后加入的两个点
u
u
u 和
v
v
v 会连出什么类型的边。
- ∀ i ∈ [ 1 , n − 2 ] , ∃ u ↔ i forall iin[1,n-2],exists uleftrightarrow i ∀i∈[1,n−2],∃u↔i
- ∀ i ∈ [ 1 , n − 2 ] , ∃ i ↔ v forall iin[1,n-2],exists ileftrightarrow v ∀i∈[1,n−2],∃i↔v
- u ↔ v uleftrightarrow v u↔v
对于
n
=
4
n=4
n=4 和
n
=
3
n=3
n=3 的情况,我们可以打表。
然后我们考虑由
n
−
2
n-2
n−2 构造
n
n
n 的答案:
n为奇数:
我们先把
n
−
1
n-1
n−1 向
∀
i
∈
[
1
,
n
−
4
]
forall iin[1,n-4]
∀i∈[1,n−4] 连一次,再向
∀
i
∈
[
1
,
n
−
3
]
forall iin[1,n-3]
∀i∈[1,n−3] 连一次。
然后对
n
n
n 进行同样操作,这样
n
,
n
−
1
n,n-1
n,n−1 和
∀
i
∈
[
1
,
n
−
3
]
forall iin[1,n-3]
∀i∈[1,n−3] 就会构成
n
−
3
2
frac{n-3}{2}
2n−3 个四元环,符合题意。
最后再把三元环
(
n
−
2
,
n
−
1
,
n
)
(n-2,n-1,n)
(n−2,n−1,n) 连两遍就好啦!
n为偶数:
我们先把
n
−
1
n-1
n−1 向
∀
i
∈
[
1
,
n
−
5
]
forall iin[1,n-5]
∀i∈[1,n−5] 连一次,再向
∀
i
∈
[
1
,
n
−
4
]
forall iin[1,n-4]
∀i∈[1,n−4] 连一次。
然后对
n
n
n 进行同样操作,这样
n
,
n
−
1
n,n-1
n,n−1 和
∀
i
∈
[
1
,
n
−
4
]
forall iin[1,n-4]
∀i∈[1,n−4] 就会构成
n
−
4
2
frac{n-4}{2}
2n−4 个四元环,符合题意。
这是从上面复制的
最后再把三元环
(
n
−
3
,
n
−
1
,
n
)
,
(
n
−
2
,
n
−
1
,
n
)
(n-3,n-1,n),(n-2,n-1,n)
(n−3,n−1,n),(n−2,n−1,n) 和四元环
(
n
−
3
,
n
−
2
,
n
−
1
,
n
)
(n-3,n-2,n-1,n)
(n−3,n−2,n−1,n) 连两遍就好啦!
代码:
#include#define freo(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout) #define ll long long #define id(i,j) ((i-1)*d+j) using namespace std; const int maxn=305*305; int a[maxn],b[maxn],c[maxn],d[maxn],ecnt,num[maxn]; inline ll read() { ll ret=0;char ch=' ',c=getchar(); while(!(c<='9'&&c>='0')) ch=c,c=getchar(); while(c<='9'&&c>='0') ret=(ret<<1)+(ret<<3)+c-'0',c=getchar(); return ch=='-'?-ret:ret; } void add(int x,int y,int z) {a[++ecnt]=x,b[ecnt]=y,c[ecnt]=z;num[ecnt]=3;} void add(int x,int y,int z,int q) {a[++ecnt]=x,b[ecnt]=y,c[ecnt]=z,d[ecnt]=q;num[ecnt]=4;} void work(int x) { if(x==1) return; if(x==4) {add(1,2,3);add(2,3,4);add(3,4,1);add(4,1,2);return;} if(x&1) { for(int i=1;i<=x-3;i+=2) add(i,x-1,i+1,x),add(i,x-1,i+1,x); add(x-2,x-1,x);add(x-2,x-1,x); work(x-2); } else { for(int i=1;i<=x-4;i+=2) add(i,x-1,i+1,x),add(i,x-1,i+1,x); add(x-3,x-1,x);add(x-2,x-1,x);add(x-3,x-1,x-2,x); work(x-2); } } int main() { int n=read(); work(n); printf("%dn",ecnt); for(int i=1;i<=ecnt;i++) { printf("%d ",num[i]); if(num[i]==3) printf("%d %d %dn",a[i],b[i],c[i]); else printf("%d %d %d %dn",a[i],b[i],c[i],d[i]); } return 0; }



