一道构造题

· · 个人记录

P5419 [CTSC2016] 单调上升序列

题面中的证明告诉我们:对于一个带权无向完全图而言,有 n 个点(n 是偶数),有 \frac{n(n-1)}{2} 条边,那么最长的单调上升的路径为 n-1,考虑将每条边边权从小到大排序,每次交换边的两个点,那么所有的点共会被交换 n(n-1) 次,根据鸽巢原理,每个点至少被交换 n-1 次,因为边从小到大排序,所以最长的单调上升路径至少是 n-1

考虑在这个思路上进行构造:即让每个点都恰好被交换 n-1

我们考虑将从小到大枚举边权 w,考虑边权为 w 的边连接哪两个点,然后每 \frac{n}{2} 条边就恰好包含了 n 个点。

这里给出一种构造方式:

将第 n 个点去掉,然后只剩下奇数个点,考虑枚举中间点 i\in[1,n],让 i 连向 n,然后向左向右扩展,连 \frac{n}{2}-1 条边。

上代码: ```cpp #include<bits/stdc++.h> using namespace std; const int N=505; int n,w,g[N][N]; int main() { scanf("%d",&n); for(int i=1;i<n;i++) { g[i][n]=g[n][i]=++w; for(int u=i,v=i,j=1;j<n/2;j++) { u=(u==1)?n-1:u-1; v=(v==n-1)?1:v+1; g[u][v]=g[v][u]=++w; } } for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) printf("%d ",g[i][j]); puts(""); } return 0; } ```