首页 > 其他 > 详细

P5441 【XR-2】伤痕

时间:2019-07-19 20:59:05      阅读:129      评论:0      收藏:0      [点我收藏+]

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;
}

P5441 【XR-2】伤痕

原文:https://www.cnblogs.com/lizehon/p/11215641.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!