构造专项(ideas)

数学构造

P5441 【XR-2】伤痕

有点神秘。反正我不会,有人所是 CMO 的原题。
首先,一个很显然的事实是找出来的这四个点要强联通。所以总方案数减去不强连通的方案数。
通过一些手段,我们可以发现不连通的方案只有三种情况(只考虑图中某四个点)。

  1. 一个点是三个单向边的起点(有进不去的点)
  2. 不属于第一种的情况同时有一个点是三个单向边的终点(不然会重,有出不去的点)
  3. 分两组组内之间连无向边,一个组向另一个边连单向边(有一组出不去)

我也不太懂怎么证明所有不强联通的一定被包含,所以可以自己打表证明。
然后考虑如何最小化,首先第一类边我们设第 i 个点有 Si 条有向边,所以方案数为 (Si3) 。那我们就有两个式子 S1+S2+S3+...=n(n1)2n 。观察 (Si3) 发现在 2x 是凸函数,由凸函数性质可知 S1=S2=S3... 时一定不劣且方案数最小。
然后考虑第二和第三种情况,发现可以构造规避,将 n 个点放在一个正 n 边形上,每个点向循序的(n3)/2个点连单向边(有向和无向都连了),向 (n1)/2,(n+1)/2连双向边。
首先证明第二种情况不存在。

如果有四个点 a,b,c,d满足 a,b,cd 都连有一条有向边,那么,将 a 重新编号为 1,必然有a<b<c<d(n1)/2。因此 a 必然会向 b,c,d 连有向边,属于第一种情况。不考虑在二中。

接下来证明第三种情况不存在。
我们令a=1,b=(n+1)/2 它们之间无向边,则要找到两个点 c,d 满足 a,b 分别向 c,d 连有向边,同时 c,d 之间连无向边。为了使得 ac,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;
}
posted @   storms11  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示