QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#667648 | #5433. Absolute Difference | Yurily | WA | 2ms | 10092kb | C++20 | 3.8kb | 2024-10-23 01:28:00 | 2024-10-23 01:28:03 |
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 0.5*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]+a[i].r-a[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]){
int 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;
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){
int ly=cur,ry=min(b[x].r,a[i].r);
int 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){
int 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: 1ms
memory: 7996kb
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: 10092kb
input:
1 1 0 1 1 1
output:
0.5000000000
result:
ok found '0.500000000', expected '0.500000000', error '0.000000000'
Test #3:
score: -100
Wrong Answer
time: 1ms
memory: 7980kb
input:
1 1 -1000000000 1000000000 -1000000000 1000000000
output:
166666666.9970991694
result:
wrong answer 1st numbers differ - expected: '666666666.6666666', found: '166666666.9970992', error = '0.7500000'