QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#108402 | #5433. Absolute Difference | Fanch100 | WA | 4ms | 3988kb | C++14 | 4.2kb | 2023-05-24 21:45:03 | 2023-05-24 21:45:07 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
const long double eps = 1e-10;
int n, m;
struct node{
long double l,r;
long double mid;
bool operator < (const node &rhs){return l<rhs.l;}
}a[N], b[N];
long double suma, sumb;
long double calc(long double l1,long double r1,long double l2,long double r2){
if (l1>l2 || (l1==l2 && r1>r2)) swap(l1,l2), swap(r1,r2);
// printf("lr=%d %d %d %d\n",l1,r1,l2,r2);
long double tmp1=0, tmp2=0, tmp3=0;
if (r2!=l2) tmp1=1.0*(r2-r1)/(r2-l2)*(1.0*(r1+r2)/2-1.0*(r1+l1)/2);
if (r2!=l2 && l2!=l1) tmp2=1.0*(r1-l2)/(r2-l2)*(l2-l1)/(r1-l1)*(1.0*(r1+l2)/2-1.0*(l1+l2)/2);
if (r1!=l1 && r2!=l2) tmp3=1.0/3*(r1-l2)*(r1-l2)*(r1-l2)/(r1-l1)/(r2-l2);
// printf("c1 %.10lf %.10lf %.10lf\n",tmp1,tmp2,tmp3);
return tmp1+tmp2+tmp3;
}
long double calc2(long double l1,long double r1,long double l2,long double r2){
if (l1>l2 || (l1==l2 && r1<r2)) swap(l1,l2), swap(r1,r2);
// printf("lr=%d %d %d %d\n",l1,r1,l2,r2);
long double tmp1=0, tmp2=0, tmp3=0;
if (r1!=l1) {
tmp1=1.0*(r2-l2)/(r1-l1)/3*(r2-l2);
tmp2=1.0*(l2-l1)/(r1-l1)*(1.0*(l2+r2)/2-1.0*(l1+l2)/2);
tmp3=1.0*(r1-r2)/(r1-l1)*(1.0*(r1+r2)/2-1.0*(l2+r2)/2);
}
// printf("c2 %.10lf %.10lf %.10lf\n",tmp1,tmp2,tmp3);
return tmp1+tmp2+tmp3;
}
long double pre[N], suf[N];
long double pres[N], sufs[N];
bool conc(long double l1,long double r1,long double l2,long double r2){
return (l1<=l2 && r2<=r1) || (l2<=l1 && r1<=r2);
}
bool inter(long double l1,long double r1,long double l2,long double r2){
return (l2<=r1 && l1<=r2);
}
int main(){
cin>>n>>m;
long double mx=0;
for (int i=1;i<=n;++i) cin>>a[i].l>>a[i].r, mx=max(mx,fabs(a[i].r));
for (int i=1;i<=m;++i) cin>>b[i].l>>b[i].r, mx=max(mx,fabs(b[i].r));
mx=1; mx*=eps;
for (int i=1;i<=n;++i) a[i].r+=mx, a[i].mid=1.0*(a[i].l+a[i].r)/2, suma+=a[i].r-a[i].l;
for (int i=1;i<=m;++i) b[i].r+=mx, b[i].mid=1.0*(b[i].l+b[i].r)/2, sumb+=b[i].r-b[i].l;
// printf("%.10lf\n",calc(a[1].l,a[1].r,b[1].l,b[1].r));
// printf("%.10lf\n",calc2(a[1].l,a[1].r,b[1].l,b[1].r));
sort(a+1,a+1+n); sort(b+1,b+1+m);
if (a[1].l>b[1].l){
for (int i=1;i<=max(n,m);++i) swap(a[i],b[i]);
swap(n,m); swap(suma,sumb);
}
for (int i=1;i<=m;++i) pre[i]=pre[i-1]+1.0*(b[i].r-b[i].l)/sumb*b[i].mid, pres[i]=pres[i-1]+(b[i].r-b[i].l)/sumb;
for (int i=m;i>=1;--i) suf[i]=suf[i+1]+1.0*(b[i].r-b[i].l)/sumb*b[i].mid, sufs[i]=sufs[i+1]+(b[i].r-b[i].l)/sumb;
long double ans=0;
for (int i=1,L=1,R=1;i<=n;++i){
long double p1=1.0*(a[i].r-a[i].l)/suma;
// printf("p1=%.15Lf eps=%.15Lf suma=%.15Lf\n",p1,eps,suma);
while(L<=m && b[L].r<a[i].l) ++L; R=L;
// printf("i=%d L=%d R=%d\n",i,L,R);
if (L<=m && inter(a[i].l,a[i].r,b[L].l,b[L].r)){
R=L;
while(R<=m && inter(a[i].l,a[i].r,b[R].l,b[R].r)) ++R;
R--;
for (int j=L;j<=R;++j){
long double p2=1.0*(b[j].r-b[j].l)/sumb;
// printf("i=%d j=%d p1=%.10lf p2=%.10lf\n",i,j,p1,p2);
if (conc(a[i].l,a[i].r,b[j].l,b[j].r)) ans+=p1*p2*calc2(a[i].l,a[i].r,b[j].l,b[j].r);
else ans+=p1*p2*calc(a[i].l,a[i].r,b[j].l,b[j].r);
}
ans+=p1*((a[i].mid*pres[L-1]-pre[L-1])+(suf[R+1]-a[i].mid*sufs[R+1]));
L=R;
}
else {
// printf("L=%d suf=%.10lf\n",L,suf[L]-a[i].mid*(m+1-L));
ans+=p1*((a[i].mid*pres[L-1]-pre[L-1])+(suf[L]-a[i].mid*sufs[L]));
}
// printf("i=%d L=%d R=%d\n",i,L,R);
}
printf("%.10Lf\n",ans);
return 0;
}
/*
1 2
8 10
8 9
4 10
2.222222
2 2
7 9
4 4
6 7
5 9
1.333333
1 2
1 2
3 4
5 6
1 1
1 4
2 5
1 1
2 3
1 4
^Z
0.777777777778
2 2
1 2
3 4
1 5
6 7
1.333333333333
1 1
1 2
1 5
^Z
1.583333333333
14 14
-735 -735
-829 -829
-6376 -6376
8558 8558
155 155
5533 5533
8800 8800
-1738 -1738
919 919
52 52
2076 2076
-6911 -6911
139 139
6733 6733
9923 9923
-4619 -4619
-9429 -9429
9902 9902
-5984 -5984
2580 2580
8738 8738
7960 7960
3388 3388
-2689 -2689
7986 7986
2565 2565
-8908 -8908
9359 9359
7105.7245003497
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 3636kb
input:
1 1 0 1 0 1
output:
0.3333333334
result:
ok found '0.333333333', expected '0.333333333', error '0.000000000'
Test #2:
score: 0
Accepted
time: 2ms
memory: 3844kb
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: 0ms
memory: 3724kb
input:
1 1 -1000000000 1000000000 -1000000000 1000000000
output:
666666666.6666666667
result:
ok found '666666666.666666627', expected '666666666.666666627', error '0.000000000'
Test #4:
score: 0
Accepted
time: 2ms
memory: 3672kb
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: 1ms
memory: 3844kb
input:
1 1 -1000000000 -1000000000 -1000000000 1000000000
output:
1000000000.0000000001
result:
ok found '1000000000.000000000', expected '1000000000.000000000', error '0.000000000'
Test #6:
score: 0
Accepted
time: 1ms
memory: 3724kb
input:
1 1 -999999999 1000000000 -1000000000 -1000000000
output:
1000000000.5000000000
result:
ok found '1000000000.500000000', expected '1000000000.500000000', error '0.000000000'
Test #7:
score: 0
Accepted
time: 2ms
memory: 3672kb
input:
1 1 -1000000000 1000000000 -999999999 -999999999
output:
999999999.0000000005
result:
ok found '999999999.000000000', expected '999999999.000000000', error '0.000000000'
Test #8:
score: 0
Accepted
time: 3ms
memory: 3728kb
input:
1 1 1000000000 1000000000 -1000000000 -1000000000
output:
2000000000.0000000000
result:
ok found '2000000000.000000000', expected '2000000000.000000000', error '0.000000000'
Test #9:
score: 0
Accepted
time: 0ms
memory: 3796kb
input:
1000 1000 -2175 -2174 -1068 -1065 -1721 -1718 777 834 1162 1169 -3529 -3524 3966 3993 1934 1952 -234 -223 -4967 -4947 8500 8510 5272 5276 -6048 -6033 -34 -22 700 705 -7890 -7886 5538 5543 4114 4126 -9201 -9162 -1521 -1519 -5103 -5100 439 441 993 997 -1684 -1680 -8413 -8404 6724 6728 -3242 -3239 2616...
output:
6717.1171457385
result:
ok found '6717.117145738', expected '6717.117145739', error '0.000000000'
Test #10:
score: 0
Accepted
time: 4ms
memory: 3952kb
input:
1000 1000 -5010 -4999 -2128 -2113 -5798 -5765 705 713 -3956 -3938 -5308 -5307 6759 6772 -772 -770 -860 -859 2308 2323 -5500 -5500 5140 5177 -6747 -6733 7509 7511 8864 8870 -6382 -6374 1901 1904 -5763 -5760 3019 3027 2962 2963 -314 -301 -222 -203 -726 -724 -62 -58 -1203 -1195 -5216 -5215 -4298 -4292 ...
output:
6682.5811326182
result:
ok found '6682.581132618', expected '6682.581127471', error '0.000000001'
Test #11:
score: 0
Accepted
time: 4ms
memory: 3988kb
input:
1000 1000 770 770 5869 5869 -8786 -8786 7549 7549 -4165 -4165 4023 4023 -9779 -9779 7797 7797 1105 1105 508 508 7653 7653 -359 -359 9393 9393 -9363 -9363 -4160 -4160 -3682 -3682 9409 9409 -8548 -8548 -9908 -9908 -7494 -7494 3751 3751 2326 2326 -3311 -3311 3651 3651 -7663 -7663 5376 5376 -7071 -7071 ...
output:
6673.7568219007
result:
ok found '6673.756821901', expected '6673.756816891', error '0.000000001'
Test #12:
score: -100
Wrong Answer
time: 1ms
memory: 3788kb
input:
1000 1000 -735 -735 -829 -829 -6376 -6376 8558 8558 155 155 5533 5533 8800 8800 -1738 -1738 919 919 52 52 2076 2076 -6911 -6911 139 139 6733 6733 9923 9923 -4619 -4619 -9429 -9429 9902 9902 -5984 -5984 2580 2580 8738 8738 7960 7960 3388 3388 -2689 -2689 7986 7986 2565 2565 -8908 -8908 9359 9359 -434...
output:
6479.3846900858
result:
wrong answer 1st numbers differ - expected: '6479.3846800', found: '6479.3846901', error = '0.0000000'