zoukankan      html  css  js  c++  java
  • bzoj 4481: [Jsoi2015]非诚勿扰【期望+树状数组】

    首先很容易计算对于一个如意郎君列表里有x个男性的女性,编号排第i位的男性被选的概率是

    [ p*(1-p)^{i-1}+p*(1-p)^{i-1+n}+p*(1-p)^{i-1+n}+… ]

    [=p*((1-p)^{i-1}+(1-p)^{i-1+n}+(1-p)^{i-1+n}+…) ]

    然后我就不会了……
    然后发现有个神奇的东西叫无限等比数列求和公式,只适用于公比绝对值小于1的情况:

    [a1+a1*q+a1*q^2+……+a1*q^{inf} ]

    [=frac{a1-a1*q^{inf+1}}{1-q} ]

    因为fabs(q)<1,所以-a1*q^{inf+1}无限趋近于0,就当成0算

    [=frac{a1}{1-q} ]

    然后剩下就是用树状数组求逆序对了

    #include<iostream>
    #include<cstdio>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int N=500005;
    int n,m;
    long double p,t[N],ans;
    struct qwe
    {
    	int b;
    	long double p;
    	qwe(int B=0,long double P=0)
    	{
    		b=B,p=P;
    	}
    };
    vector<qwe>a[N];
    bool cmp(const qwe &a,const qwe &b)
    {
    	return a.b<b.b;
    }
    int read()
    {
    	int r=0,f=1;
    	char p=getchar();
    	while(p>'9'||p<'0')
    	{
    		if(p=='-')
    			f=-1;
    		p=getchar();
    	}
    	while(p>='0'&&p<='9')
    	{
    		r=r*10+p-48;
    		p=getchar();
    	}
    	return r*f;
    }
    void update(int x,long double v)
    {
    	for(int i=x;i<=n;i+=(i&(-i)))
    		t[i]+=v;
    }
    long double ques(int x)
    {
    	long double r=0;
    	for(int i=x;i>=1;i-=(i&(-i)))
    		r+=t[i];
    	return r;
    }
    int main()
    {
    	n=read(),m=read();
    	cin>>p;
    	for(int i=1;i<=m;i++)
    	{
    		int x=read(),y=read();
    		a[x].push_back(qwe(y,0.0));
    	}
    	for(int i=1;i<=n;i++)
    	{
    		sort(a[i].begin(),a[i].end(),cmp);
    		long double q=1;
    		for(int j=0;j<a[i].size();j++)
    			a[i][j].p=q,q*=(1-p);
    		for(int j=0;j<a[i].size();j++)
    			a[i][j].p=a[i][j].p*p/(1.0-q);
    	}
    	for(int i=n;i>=1;i--)
    	{
    		for(int j=0;j<a[i].size();j++)
    			ans+=a[i][j].p*ques(a[i][j].b-1);
    		for(int j=0;j<a[i].size();j++)
    			update(a[i][j].b,a[i][j].p);
    	}
    	printf("%.2f
    ",(double)ans);
    	return 0;
    }
    
  • 相关阅读:
    C++之栈的应用-------判断出栈序列是否合法
    PHP 使用soap调用webservice接口
    C++矩阵转置
    C++利用栈实现队列、利用队列实现栈
    C++ error LNK2019: 无法解析的外部符号
    定时任务
    spring boot redis CacheManager
    非正常关闭vim编辑器后提示错误的解决方法
    python pandas学习记录 二
    layui点击放大图片
  • 原文地址:https://www.cnblogs.com/lokiii/p/9640598.html
Copyright © 2011-2022 走看看