构造专项(ideas)
数学构造
P5441 【XR-2】伤痕
有点神秘。反正我不会,有人所是 \(CMO\) 的原题。
首先,一个很显然的事实是找出来的这四个点要强联通。所以总方案数减去不强连通的方案数。
通过一些手段,我们可以发现不连通的方案只有三种情况(只考虑图中某四个点)。
- 一个点是三个单向边的起点(有进不去的点)
- 不属于第一种的情况同时有一个点是三个单向边的终点(不然会重,有出不去的点)
- 分两组组内之间连无向边,一个组向另一个边连单向边(有一组出不去)
我也不太懂怎么证明所有不强联通的一定被包含,所以可以自己打表证明。
然后考虑如何最小化,首先第一类边我们设第 \(i\) 个点有 \(S_i\) 条有向边,所以方案数为 \(\binom{S_i}{3}\) 。那我们就有两个式子 \(S_1+S_2+S_3+...=\frac{n*(n-1)}{2}-n\) 。观察 \(\binom{S_i}{3}\) 发现在 \(2\le x\) 是凸函数,由凸函数性质可知 \(S_1=S_2=S_3...\) 时一定不劣且方案数最小。
然后考虑第二和第三种情况,发现可以构造规避,将 \(n\) 个点放在一个正 \(n\) 边形上,每个点向循序的\((n-3)/2\)个点连单向边(有向和无向都连了),向 \((n-1)/2,(n+1)/2\)连双向边。
首先证明第二种情况不存在。
如果有四个点 \(a,b,c,d\)满足 \(a,b,c\) 向 \(d\) 都连有一条有向边,那么,将 \(a\) 重新编号为 \(1\),必然有\(a<b<c<d≤(n-1)/2\)。因此 \(a\) 必然会向 \(b,c,d\) 连有向边,属于第一种情况。不考虑在二中。
接下来证明第三种情况不存在。
我们令a=1,b=(n+1)/2 它们之间无向边,则要找到两个点 \(c,d\) 满足 \(a,b\) 分别向 \(c,d\) 连有向边,同时 \(c,d\) 之间连无向边。为了使得 \(a\) 向 \(c,d\) 连有向边,必须满足 \(a<c<d<b\),这种情况下,\(c,d\) 之间显然只能是有向边。
所以不存在第三种情况。(证明借鉴了洛谷题解)
#include<bits/stdc++.h>
#define reg register
typedef long long ll;
using namespace std;
const int N=105;
int n,mp[N][N];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n;
if(n==1)
{
cout<<"0"<<'\n'<<'0';//特殊处理选不出方案的情况
return 0;
}
cout<<(1ll*n*(n-3)*(n*n+6*n-31)/48)<<'\n';
//最大方案数
for(int i=1;i<=n;i++)
for(int j=1;j<=(n+1)/2;j++)
mp[i][(i+j-1)%n+1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<mp[i][j]<<' ';
cout<<'\n';
}
return 0;
}