题目:click
题意:一家公司有n个员工,第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;
}