2018 ACM-ICPC North Central North America Regional Contest H.New Salaries

题目:click
题意:一家公司有n个员工,第i个员工的工资范围在[ L i L_i , R i R_i ], L i 1 < = L i L_{i-1}<=L_i , R i 1 < = R i R_{i-1}<=R_{i} ,注意L和R可以为小数,如果一个员工的工资比另一个员工的工资差的话,员工可以投诉,公司将对工资差进行补偿,问公司的赔款期望。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述在这里插入图片描述

#include<cmath>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cstdlib>
#include<istream>
#include<vector>
#include<stack>
#include<set>
#include<map>
#include<algorithm>
#include<queue>
#define inf 0x3f3f3f3f
#define llinf 0x3f3f3f3f3f3f3f3f
#define MAX_len 200005*4
using namespace std;
typedef long long ll;
typedef pair<int,int> PP;
const int mod=998244353;
const int MAXlen=1e5+10;
long double eps=1e-9;
long double l[MAXlen],r[MAXlen];
long double sum[MAXlen],RRR[MAXlen],R[MAXlen],RL[MAXlen],RR[MAXlen];
int main()
{
    int n,i,j;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%Lf %Lf",&l[i],&r[i]);
        if(r[i]-l[i]<=eps)
        {
            RRR[i]=RRR[i-1];
            R[i]=R[i-1];
            RR[i]=RR[i-1];
            RL[i]=RL[i-1];
            sum[i]=sum[i-1]+(r[i]+l[i])/2.0;
            continue;
        }
        RRR[i]=(r[i]*r[i]*r[i])/(r[i]-l[i])+RRR[i-1];
        R[i]=R[i-1]+r[i]/(r[i]-l[i]);
        RR[i]=RR[i-1]+r[i]*r[i]/(r[i]-l[i]);
        RL[i]=RL[i-1]+1.0/(r[i]-l[i]);
        sum[i]=sum[i-1]+(r[i]+l[i])/2.0;
    }
    long double ans=0;
    for(i=1;i<=n;i++)
    {
        ans+=(i-1)*1.0*(r[i]+l[i])/2.0-sum[i-1];
        if(r[i]-l[i]<=eps)
            continue;
        int temp=upper_bound(r+1,r+1+n,l[i])-r;
        if(temp>=i)
            continue;
        ans+=(1.0/3.0/(r[i]-l[i]))*(RRR[i-1]-RRR[temp-1]);
        ans-=(l[i]/(r[i]-l[i]))*(RR[i-1]-RR[temp-1]);
        ans+=(l[i]*l[i]/(r[i]-l[i]))*(R[i-1]-R[temp-1]);
        ans-=(l[i]*l[i]*l[i]/3.0/(r[i]-l[i]))*(RL[i-1]-RL[temp-1]);
    }
    ans=ans/(n*1.0)/(n*1.0);
    printf("%.9Lf",ans);
    return 0;
}


猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/106576979