QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#108398#5433. Absolute DifferenceFanch100WA 4ms3880kbC++144.2kb2023-05-24 21:42:312023-05-24 21:42:32

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-24 21:42:32]
  • 评测
  • 测评结果:WA
  • 用时:4ms
  • 内存:3880kb
  • [2023-05-24 21:42:31]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
const long double eps = 1e-13;
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*=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("%.9Lf\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.333333333

result:

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

Test #2:

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

input:

1 1
0 1
1 1

output:

0.500000000

result:

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

Test #3:

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

input:

1 1
-1000000000 1000000000
-1000000000 1000000000

output:

666666666.666700000

result:

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

Test #4:

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

input:

1 1
-1000000000 0
0 1000000000

output:

1000000000.000000000

result:

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

Test #5:

score: 0
Accepted
time: 3ms
memory: 3680kb

input:

1 1
-1000000000 -1000000000
-1000000000 1000000000

output:

1000000000.000000000

result:

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

Test #6:

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

input:

1 1
-999999999 1000000000
-1000000000 -1000000000

output:

1000000000.500000000

result:

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

Test #7:

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

input:

1 1
-1000000000 1000000000
-999999999 -999999999

output:

999999999.000000000

result:

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

Test #8:

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

input:

1 1
1000000000 1000000000
-1000000000 -1000000000

output:

2000000000.000000000

result:

ok found '2000000000.000000000', expected '2000000000.000000000', error '0.000000000'

Test #9:

score: 0
Accepted
time: 4ms
memory: 3880kb

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.117145730

result:

ok found '6717.117145730', expected '6717.117145739', error '0.000000000'

Test #10:

score: -100
Wrong Answer
time: 4ms
memory: 3876kb

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.581035582

result:

wrong answer 1st numbers differ - expected: '6682.5811275', found: '6682.5810356', error = '0.0000000'