P5441 【XR-2】伤痕

Luogu5441
有 \(n\) 个点 ( \(n\) 为奇数 , \(n \le 99\) ) 的完全图 , 其中可以有最多 \(n\) 条无向边 , 其他都是有向边 . 如果对于某四个点不经过这四个点以外的点能够相互到达 , 则构成一组合法方案 . 现在需要输出一种构图方法 , 使得合法方案数最大 .
输出格式 : 最大方案数 ; 一个邻接矩阵 : \(f[i][j]=0/1\) 表示能否从 \(i\) 到 \(j\) .

洛谷原题解
想办法算出最少的不合法的方案数 , 观察发现 ,对于四个点不是强连通的只有三种情况 :
对于第三种情况不好算 , 考虑计算第一种情况 , 前两种情况本质是一样的 .
想了半天这道题完全是在乱搞骗分 , 没有证明什么第三种情况不是更优的 , 但还是把官方题解摆出来 , 就当涨涨见识吧 .

设 \(s[i]\) 表示i连出的有向边 . 则 \(ans = \sum C_{s[i]}^3\) , 且有 \(\sum s[i] = \frac{n(n-1)}{2}-n =n\frac{n-3}{2}\) (因为 \(n\) 是奇数)
对于函数 \(C_x^3 = \frac{x(x-1)(x-2)}{6}\) , 在 $ x \ge 3$ 时是凸函数 .
对于凸函数有一个性质: \(f(a)+f(b) \ge 2f(\frac{a+b}{2})\) 可以猜想出 \(f(a)+f(b)+f(c) \ge 3f(\frac{a+b+c}{3})\) ,
进一步猜想出对于 \(n\) 个数有 \(f(a_1) + \dots + f(a_n) \ge nf(\frac{a_1+\dots+a_n}{n})\) . (这题要用到 , 我只会打表证明)
所以 \(ans >= n \times C_{\frac{n-3}{2}}^3\) . 这样方案数就可以直接算出来 \(C_{n}^{4} - n \times C_{\frac{n - 3}{2}}^{3} = \frac{n(n-3)(n^2+6n-31)}{48}\)

关于构造方案 : 所有最长的对角线 ( 一共有 \(n\) 条 ) 是无向边 , 每个点向顺时针的 \(\frac{n-3}{2}\) 个点连有向边 .

\(\dots\) 写不下去了我觉得这是错的 , 为什么 \(spj\) 跑出来是对的 ? 算了就当长见识到这里吧 .
原题 : 高中奥数教程(小蓝本)图论P73 , 作为数学题来说还是道好题的 .
可能这就是信息选手不严谨的乱搞骗分吧 .

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    if (n == 1) {
        cout << 0 << endl << 0 << endl;
        return 0;
    }
    cout << n * (n - 3) * (n * n + 6 * n - 31) / 48 << endl;
    int m = (n + 1) >> 1;
    for (int i = 1; i <= n; i++) {
        int a[n+1];
        memset(a, 0, sizeof(a));
        for (int j = 1; j <= m; j++)
            a[(i+j-1)%n+1] = 1;
        for (int j = 1; j < n; j++) cout << a[j] << " ";
        cout << a[n] << endl;
    }
    return 0;
}
上一篇:【算法剖析】寻找两个已序数组中的第k大元素


下一篇:Configure SRX 240 cluster Step by Step