【summary】mat 【万恶溢出!!】

来源:互联网 发布:机战登录器源码 编辑:程序博客网 时间:2024/06/08 19:36

教训:int*int除了考虑最后答案溢出还要考虑中间溢出呀!(唔。。虽然最后全部换成了LL)

#include<cstdio>#include<iostream>#include<cmath>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;typedef long double LD;void read(LL& x){char c = getchar();x = 0;bool flag = false;while(c<'0'||c>'9')c=='-'?flag=true:1,c=getchar();while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}flag?x=-x:1;}#define maxn 50010LL n,a[maxn],b[maxn];LL sum[maxn],sqsum[maxn];LD ans = 0.0;inline LD cal(int i,int k,LL s,LL ss){return ((LL)k*a[i]*a[i]-2LL*a[i]*s+ss)*1.0/n;}int main(void){#define ACK#ifdef ACKfreopen("mat.in","r",stdin);freopen("mat.out","w",stdout);#endifread(n);for(int i=1;i<=n;i++)read(a[i]);for(int i=1;i<=n;i++)read(b[i]);sort(a+1,a+1+n);sort(b+1,b+1+n);for(int i=1;i<=n;i++){sum[i]=sum[i-1]+b[i];sqsum[i]=sqsum[i-1]+b[i]*b[i];}int cnt = 0;for(int i=1;i<=n;i++)if(a[1]<b[i]){cnt = i-1;break;}for(int i=1;i<=n;i++){while(cnt<n&&a[i]>b[cnt+1])cnt++;ans+=cal(i,cnt,sum[cnt],sqsum[cnt]);if(cnt<n)ans-=cal(i,n-cnt,sum[n]-sum[cnt],sqsum[n]-sqsum[cnt]);}printf("%.1lf",(double)ans);return 0;}


1 0
原创粉丝点击