QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#667661#5433. Absolute DifferenceYurilyTL 2ms10040kbC++203.9kb2024-10-23 01:44:252024-10-23 01:44:25

Judging History

你现在查看的是最新测评结果

  • [2024-10-23 01:44:25]
  • 评测
  • 测评结果:TL
  • 用时:2ms
  • 内存:10040kb
  • [2024-10-23 01:44:25]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5+5;
struct area{
	int l,r;
};
area a[MAX],b[MAX];
long double presum[MAX],ps[MAX],sufsum[MAX],ss[MAX];
long long pa[MAX],pb[MAX],tota,totb;
long double ans;
int cnta,cntb,n,m;
long long psum[MAX],sa;
long long lens[MAX];
long long tmpp[MAX];
area tmp[MAX];
long double calc1(long double y,long double c1,long double c2,long double c3){
	return c1*y*y*y+c2*y*y+c3*y;
}
long double calc2(long double y,long double c1,long double c2){
	return c1*y*y+c2*y;
}
long double calc3(long double y,long double c1,long double c2){
	return y*y+c1*y+c2;
}
long double calc4(long double y,long double c1,long double c2){
	return c1*y+c2;
}
// 快读 
int findf(int x){
	int l=1,r=m+1,res;
	while(l<=r){
		int mid=l+r>>1;
		if(b[mid].r>x){
			res=mid;
			r=mid-1;
		}
		else
			l=mid+1; 
	}
	return res;
}
int find2(int x){
	int l=1,r=totb,res=totb+1;
	while(l<=r){
		int mid=l+r>>1;
		if(pb[mid]>=x){
			res=mid;
			r=mid-1;
		}
		else
			l=mid+1; 
	}
	return res;
}
int read(){
	int x = 0, f = 1;
	char c = getchar();
	while(c < '0' || c > '9'){
		if(c == '-'){
			f = -1;
		}
		c = getchar();
	}
	while(c >= '0' && c <= '9'){
		x = x*10+c-'0';
		c = getchar();
	}
	return x*f;
}
bool cmp(area x,area y){
	return x.l<y.l;
}
void SWAP(){	
	for(int i=1;i<=n;++i)
		tmp[i]=a[i];//	cout<<"(("<<endl;
	for(int i=1;i<=m;++i)
		a[i]=b[i];
	for(int i=1;i<=n;++i)
		b[i]=tmp[i];

	for(int i=1;i=tota;++i)
		tmpp[i]=pa[i];
	for(int i=1;i<=totb;++i)
		pa[i]=pb[i];
	for(int i=1;i<=tota;++i)
		pb[i]=tmpp[i];	
	
	swap(n,m);
	swap(tota,totb);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		a[++cnta].l=read(),a[cnta].r=read();
		sa+=a[cnta].r-a[cnta].l;
		if(a[cnta].r==a[cnta].l){
			pa[++tota]=a[cnta].l;
			cnta--;
		}
	}
	for(int i=1;i<=m;++i){
		b[++cntb].l=read(),b[cntb].r=read();
		if(b[cntb].r==b[cntb].l){
			pb[++totb]=b[cntb].l;
			cntb--;
		}
	}
	
	n=cnta,m=cntb;//cout<<n<<" "<<m<<endl;
	if(m==0)
		SWAP();
//	cout<<"**"<<endl;
	if(n)
		sort(a+1,a+1+n,cmp);
	if(m)
		sort(b+1,b+1+m,cmp);
	b[m+1].l=2e9,b[m+1].r=2e9;
	
	for(int i=1;i<=m;++i){
		presum[i]=presum[i-1]+b[i].r-b[i].l;
		ps[i]=ps[i-1]+0.5*b[i].l*b[i].l-0.5*b[i].r*b[i].r;
	}	
	for(int i=m;i>=1;--i){
		sufsum[i]=sufsum[i+1]+b[i].l-b[i].r;
		ss[i]=ss[i+1]+0.5*b[i].r*b[i].r-0.5*b[i].l*b[i].l;
	}
	
	if(n==0&&m==0){
		for(int i=1;i<=totb;++i){
			psum[i]=psum[i-1]+pb[i];
		}
		for(int i=1;i<=tota;++i){
			int x=find2(pa[i]);
			ans+=max(0ll,totb-x)*1.0/totb*((psum[m]-psum[x-1])-pa[i]*(m-x+1))+(x-1)*1.0/totb*(pa[i]*(x-1)-psum[x-1]);
		}
		ans/=1.0*tota;
		printf("%.10Lf",ans);
		return 0;
	}
	else{
		if(n==0){
//			cout<<"))"<<endl;
			for(int i=1;i<=tota;++i){
				int x=findf(pa[i]);
//				cout<<pa[i]<<" "<<i<<" "<<x<<endl;
				if(b[x].l<=pa[i]){
					long long lx=b[x].l,rx=b[x].r;
					ans+=calc3(pa[i],presum[x-1]-lx+sufsum[x+1]-rx,0.5*lx*lx+ps[x-1]+0.5*rx*rx+ss[x+1]);
				}
				if(b[x].l>pa[i]){
				//	cout<<presum[x-1]+sufsum[x]<<" "<<ps[x-1]+ss[x]<<endl;
					ans+=calc4(pa[i],presum[x-1]+sufsum[x],ps[x-1]+ss[x]);
				}	
			}
			ans/=tota;
//			cout<<presum[m]<<endl;
			ans/=presum[m];
			printf("%.10Lf",ans);
			return 0;
		}
	}	
	for(int i=1;i<=n;++i){
		int cur=a[i].l;
		while(cur<a[i].r){
			int x=findf(cur);
			if(b[x].l<=cur){
				long long ly=cur,ry=min(b[x].r,a[i].r);
				long long lx=b[x].l,rx=b[x].r;
				ans+=calc1(ry,1.0/3,(presum[x-1]+sufsum[x+1]-lx-rx)*0.5,0.5*(lx*lx+rx*rx)+ps[x-1]+ss[x+1])
					-calc1(ly,1.0/3,(presum[x-1]+sufsum[x+1]-lx-rx)*0.5,0.5*(lx*lx+rx*rx)+ps[x-1]+ss[x+1]);
				
				cur=ry;
			}
			if(b[x].l>cur){
				long long ly=cur,ry=min(b[x].l,a[i].r);
				ans+=calc2(ry,(presum[x-1]+sufsum[x])*0.5,ps[x-1]+ss[x])
					 -calc2(ly,(presum[x-1]+sufsum[x])*0.5,ps[x-1]+ss[x]);
				cur=ry;
			}
		}
	}
	printf("%.10Lf",ans/sa/presum[m]);
} 

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 7976kb

input:

1 1
0 1
0 1

output:

0.3333333333

result:

ok found '0.333333333', expected '0.333333333', error '0.000000000'

Test #2:

score: 0
Accepted
time: 2ms
memory: 10040kb

input:

1 1
0 1
1 1

output:

0.5000000000

result:

ok found '0.500000000', expected '0.500000000', error '0.000000000'

Test #3:

score: 0
Accepted
time: 2ms
memory: 8044kb

input:

1 1
-1000000000 1000000000
-1000000000 1000000000

output:

666666666.6666666574

result:

ok found '666666666.666666627', expected '666666666.666666627', error '0.000000000'

Test #4:

score: 0
Accepted
time: 1ms
memory: 5940kb

input:

1 1
-1000000000 0
0 1000000000

output:

1000000000.0000000000

result:

ok found '1000000000.000000000', expected '1000000000.000000000', error '0.000000000'

Test #5:

score: 0
Accepted
time: 0ms
memory: 10020kb

input:

1 1
-1000000000 -1000000000
-1000000000 1000000000

output:

1000000000.0000000000

result:

ok found '1000000000.000000000', expected '1000000000.000000000', error '0.000000000'

Test #6:

score: 0
Accepted
time: 0ms
memory: 9968kb

input:

1 1
-999999999 1000000000
-1000000000 -1000000000

output:

1000000000.5000000002

result:

ok found '1000000000.500000000', expected '1000000000.500000000', error '0.000000000'

Test #7:

score: 0
Accepted
time: 0ms
memory: 7988kb

input:

1 1
-1000000000 1000000000
-999999999 -999999999

output:

999999999.0000000005

result:

ok found '999999999.000000000', expected '999999999.000000000', error '0.000000000'

Test #8:

score: -100
Time Limit Exceeded

input:

1 1
1000000000 1000000000
-1000000000 -1000000000

output:


result: