P5419 [CTSC2016] 单调上升序列

不难发现题面描述的比较特殊:给出了一个结论以及它的证明。

我们从中获得启发,对它进行了一个归纳总:一张 $n$ 个节点的完全图中,一定存在一条长度大于等于 $n-1$ 单调上升路径。

考虑把边划分成 $\frac{n}{2}$ 个小组之后(组内边不想交),我们可以对于同个中的边赋连续区间的值,这样就一定可以限制最长单调上升序列不超过小组的数量(由于边不相交,所以一个小组中的边必定只会走一次)。

接下来再考虑怎么求出这样一个子问题:给出一张 $n$ 个点的完全图,把边分为 $n-1$ 组完美匹配? $n$ 为偶数。

不妨做出如下构造(此处按照下标从 $0$ 开始考虑):对于所有 $0\leq x < y\leq n-1$,我们把 $(x,y)$ 这条边归入编号为 $x+y\pmod{n-1}$ 的集合。最后,处理一下所有连向 $n-1$ 的边:发现对于每个集合编号 $i$,有且仅有一个 $k$ 使得 $2k=i\pmod{n-1}$,把 $k$ 在当前集合里连向 $n-1$ 即可。

#include <bits/stdc++.h>
#define FL(i, a, b) for(int i = (a); i <= (b); i++)
#define FR(i, a, b) for(int i = (a); i >= (b); i--)
using namespace std;
const int N = 510;
int n, id[N];
vector<int> v[N];
int main(){
    scanf("%d", &n);
    FL(i, 0, n - 2) id[i] = i * n / 2;
    FL(i, 0, n - 2){
        FL(j, i + 1, n - 2)
            printf("%d ", ++id[(i + j) % (n - 1)]);
        printf("%d\n", ++id[i * 2 % (n - 1)]);
    }
    return 0;
}
posted @ 2023-08-11 20:35  徐子洋  阅读(29)  评论(0)    收藏  举报  来源