10.30T2 二分+前缀和(后缀和)
生活随笔
收集整理的這篇文章主要介紹了
10.30T2 二分+前缀和(后缀和)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
有兩個隊伍A和B,每個隊伍都有n個人。這兩支隊伍之間進行n場1對1比賽,每一場都是由A中的一個選手與B中的一個選手對抗。同一個人不會參加多場比賽,每個人的對手都是隨機而等概率的。例如A隊有A1和A2兩個人,B隊有B1和B2兩個人,那么(A1 vs B1,A2 vs B2)和(A1 vs B2,A2 vs B1)的概率都是均等的50%。每個選手都有一個非負的實力值。如果實力值為X和Y的選手對抗,那么實力值較強的選手所在的隊伍將會獲得(X-Y)^2的得分。
求A的得分減B的得分的期望值。
Input
第一行一個數n表示兩隊的人數為n。第二行n個整數,第i個數A[i]表示隊伍A的第i個人的實力值。
第三行n個整數,第i個數B[i]表示隊伍B的第i個人的實力值。
Output
輸出僅包含一個實數表示A期望贏B多少分。答案保留到小數點后一位(注意精度)。Sample Input
2 3 7 1 5Sample Output
20.0Hint
【數據規模】對于30%的數據,n≤50。
對于100%的.據,n≤50000;A[i],B[i]≤50000。 code: 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<iomanip> 5 #define N 100006 6 using namespace std; 7 long long a[N],b[N],sqsuma[N],sqsumb[N],suma[N],sumb[N]; 8 int main() { 9 int n; 10 cin>>n; 11 for(int i=1; i<=n; i++) { 12 cin>>a[i]; 13 } 14 for(int i=1; i<=n; i++) { 15 cin>>b[i]; 16 } 17 sort(a+1,a+n+1); 18 sort(b+1,b+n+1); 19 for(int i=n;i>=1;i--){ 20 sqsuma[i]=sqsuma[i+1]+a[i]*a[i]; 21 suma[i]=suma[i+1]+a[i]; 22 sqsumb[i]=sqsumb[i+1]+b[i]*b[i]; 23 sumb[i]=sumb[i+1]+b[i]; 24 } 25 long long A=0,B=0; 26 for(int i=1;i<=n;i++){ 27 int pos=upper_bound(b+1,b+n+1,a[i])-b; 28 long long now1=sqsumb[pos]; 29 long long now2=(n-pos+1)*a[i]*a[i]; 30 long long now3=2*sumb[pos]*a[i]; 31 A+=now1+now2-now3; 32 now1=(sqsumb0[1]-sqsumb[pos]); 33 now2=(pos-1)*a[i]*a[i]; 34 now3=2*(sumb[1]-sumb[pos])*a[i]; 35 B+=now1+now2-now3; 36 } 37 cout<<fixed<<setprecision(1)<<(long double)(B-A)*1.0/n; 38 return 0; 39 }
over
轉載于:https://www.cnblogs.com/saionjisekai/p/9879276.html
總結
以上是生活随笔為你收集整理的10.30T2 二分+前缀和(后缀和)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hadoop新手篇:hadoop入门基础
- 下一篇: 为什么我要放弃javaScript数据结