(纪中)3055. 比赛【期望】【数学】

119 篇文章 0 订阅
6 篇文章 0 订阅

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


解题思路

考试的时候已经推出来了,结果没想着化简TOT, n 2 n^2 n2拿30分…

我们考虑选中 A 1 A_1 A1 B 1 B_1 B1了,则剩下的A和B共有 ! ( n − 1 ) !(n-1) (n1)种组合方案,而总共有!n种组合方案,则 A 1 A_1 A1 B 1 B_1 B1的组合下可以贡献的期望为 ( A 1 − B 1 ) 2 ∗ ! ( n − 1 ) ! n \frac{(A_1-B_1)^2*!(n-1)}{!n} !nA1B1)2!(n1)

简化得 ( A 1 − B 1 ) 2 n \frac{(A_1-B_1)^2}{n} nA1B1)2

所以题目要求的是:
在这里插入图片描述

其中正负由 a [ i ] a[i] a[i] b [ i ] b[i] b[i]的大小关系决定分值的正负,正负的处理可以对b排序,比a[i]大的取负,比a[i]小的取正,上面的式子展开之后可以得到:
在这里插入图片描述
我们把A和排序,预处理b的前缀和 b 2 b^2 b2的前缀和,每次只用枚举 A i A_i Ai,统计 a n s ans ans加上 A i A_i Ai与比它小的 B i B_i Bi的正贡献,减去 A i A_i Ai与比它小的 B i B_i Bi的负贡献,就好了。(这里在找比 A i A_i Ai小的 B i B_i Bi时可以用一个指针不断右移得到)


代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#define ll long long
#define ldb long double
using namespace std;

ldb ans;
ll a[50010],b[50010],sum[50010],q[50010];
ll w,n;


int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<=n;i++)
		scanf("%lld",&b[i]);
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	for(int i=1;i<=n;i++)
	{
		sum[i]=sum[i-1]+b[i];
		q[i]=q[i-1]+pow(b[i],2);
	}
	int x=0;
	for(int i=1;i<=n;i++)
	{
		while(a[i]>b[x+1]&&x<n)x++;
		ans+=(x*pow(a[i],2)+q[x]-2*a[i]*sum[x])*1.0/n*1.0;
		ans-=((n-x)*pow(a[i],2)+q[n]-q[x]-2*a[i]*(sum[n]-sum[x]))*1.0/n*1.0;
	}
	printf("%.1Lf",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值