QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#667661 | #5433. Absolute Difference | Yurily | TL | 2ms | 10040kb | C++20 | 3.9kb | 2024-10-23 01:44:25 | 2024-10-23 01:44:25 |
Judging History
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]);
}
Details
Tip: Click on the bar to expand more detailed information
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