zoukankan      html  css  js  c++  java
  • 「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;
    }
    
  • 相关阅读:
    时间与时间戳互换
    原生js鼠标滑动滚轮事件
    php调用whois接口域名查询
    通用php与mysql数据库配置文件
    多个div独立控制其显示/隐藏
    jquery
    定时显示div
    一个清爽的弹出层特效
    自定义百度竞价电话回拨样式总结
    基于h5+ajax实现的手机定位
  • 原文地址:https://www.cnblogs.com/zsbzsb/p/12301910.html
Copyright © 2011-2022 走看看