• 「JSOI2015」非诚勿扰


    「JSOI2015」非诚勿扰

    传送门

    我们首先考虑一名女性选中她列表里第 (x) 名男性的概率(假设她列表里共有 (s) 名男性):

    [P = p imes (1 - p) ^ {x - 1} + p imes (1 - p) ^ {s + x - 1} + p imes (1 - p) ^ {2s + x - 1} + cdots + p imes (1 - p) ^ {ns + x - 1} ]

    根据等比数列求和公式以及极限的相关计算,不难求出:

    [P = frac{p imes (1 - p) ^ {x - 1}}{1 - (1 - p) ^ s} ]

    然后我们发现题目要求的是类似于逆序对的东西,但是我们要清楚这个期望怎么算。

    由于期望具有可加性,所以我们就可以对每 (1) 的贡献都算一遍期望,这个是很好算的,然后我们发现还可以用树状数组维护,其实就是相当于把可以造成贡献的部分提了个公因式然后对于后面那一大堆用前缀和来搞。

    还有就是这题好像要开 long double 才行。

    参考代码:

    #include <algorithm>
    #include <cstdlib>
    #include <cstdio>
    #include <vector>
    #include <cmath>
    #define rg register
    #define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
    using namespace std;
    template < class T > inline void read(T& s) {
        s = 0; int f = 0; char c = getchar();
        while ('0' > c || c > '9') f |= c == '-', c = getchar();
        while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
        s = f ? -s : s;
    }
     
    const int _ = 5e5 + 5;
     
    int n, m; long double p;
    vector < int > vec[_];
     
    struct BIT {
        long double tr[_];
        inline void update(int x, long double v) { for (rg int i = x; i <= m; i += i & -i) tr[i] += v; }
        inline long double query(int x) { long double res = 0.0; for (rg int i = x; i >= 1; i -= i & -i) res += tr[i]; return res; }
    } tr;
     
    int main() {
    #ifndef ONLINE_JUDGE
        file("cpp");
    #endif
        read(n), read(m), scanf("%Lf", &p);
        for (rg int u, v, i = 1; i <= m; ++i) read(u), read(v), vec[u].push_back(v);
        for (rg int i = 1; i <= n; ++i) sort(vec[i].begin(), vec[i].end());
        long double ans = 0.0, P;
        for (rg int i = 1; i <= n; ++i) {
        	P = p / (1.0 - pow(1.0 - p, (long double) vec[i].size()));
        	for (rg int j = 0; j < vec[i].size(); ++j, P *= (long double) 1.0 - p)
    	        ans += P * (tr.query(m) - tr.query(vec[i][j])), tr.update(vec[i][j], P);
        }
        printf("%.2Lf
    ", ans);
        return 0;
    }
    
  • 相关阅读:
    快速排序
    将指定目录下的所有子文件或子目录加载到TreeView
    导入英汉文本,用字符串切割,泛型集合存储的英汉字典
    取年月日的字符串方法
    简化的MVC-导入模板HTML,导入数据txt,用字符串方法生成JS菜单
    索引器的使用
    打开文件练习
    泛型委托
    将正则表达式转化成确定的有限自动机
    青蛙过桥
  • 原文地址:https://www.cnblogs.com/zsbzsb/p/12301910.html
Copyright © 2020-2023  润新知