QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#505041 | #9103. Zayin and Fireball | Afterlife | WA | 16ms | 3940kb | C++20 | 3.8kb | 2024-08-04 18:41:46 | 2024-09-23 15:04:21 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=5e2+1e1+7;
const double eps=1e-8;
struct P {
double x,y;
P operator -(const P &s) const
{
return {x-s.x,y-s.y};
}
P operator +(const P &s) const
{
return {x+s.x,y+s.y};
}
double Len() const
{
return hypot(x,y);
}
double Len2() const
{
return x*x+y*y;
}
P operator *(const double d) const
{
return {x*d,y*d};
}
P Len(const double d) const
{
return *this*d/Len();
}
P operator /(const double d) const
{
return {x/d,y/d};
}
P unit() const
{
return *this/Len();
}
P symmetry(const P &b) const
{
return b+b-*this;
}
};
bool operator <(const P &a,const P &b)
{
return a.y<b.y;
}
double dot(const P &a,const P &b)
{
return a.x*b.x+a.y*b.y;
}
struct C {
P o;
double r;
void rd()
{
int a,b,c;
cin>>a>>b>>c;
o.x=a,o.y=b,r=c;
}
};
double sgn(double x)
{
return x<-eps?-1:x>eps;
}
vector<P> circle_line_inter(P o,double r,P a,P b)
{
P h=a+(b-a).unit()*dot(o-a,(b-a).unit());
double t=r*r-(h-o).Len2();
if(sgn(t)<0)
return {};
else if(!sgn(t))
return {h,h};
else
{
P p1=(a-b).Len(sqrtl(t))+h;
P p2=p1.symmetry(h);
return {p1,p2};
}
}
vector<pair<C,C> >cs;
double eval(double X)
{
map<P,int>D;
P u={X,0},v={X,1};
for(auto [c,d]:cs)
{
auto pts=circle_line_inter(c.o,c.r,u,v);
if(!pts.size())
continue;
auto a=pts[0],b=pts[1];
if(b<a)
swap(a,b);
D[a]++;
D[b]--;
pts=circle_line_inter(d.o,d.r,u,v);
if(pts.size())
{
auto e=pts[0],f=pts[1];
if(f<e)
swap(e,f);
a.y=max(a.y,e.y);
b.y=min(b.y,f.y);
if(a.y<=b.y)
D[a]--,D[b]++;
}
}
if(!D.size())
return 0;
double ret=0;
int S=0;
for(auto it=D.begin();next(it)!=D.end();it++)
{
double dy=next(it)->first.y-it->first.y;
S+=it->second;
if(S>0)
{
ret+=dy;
}
// assert(S>=0);
}
return ret;
}
double sim(double l,double r)
{
return (eval(l)+eval(r)+4*eval((l+r)/2))*(r-l)/6;
}
double simp(double l,double r)
{
// if(r-l<0.001)
// return 0;
double mid=(l+r)/2;
if(fabs(sim(l,r)-sim(l,mid)-sim(mid,r))<1e-4)
return sim(l,mid)+sim(mid,r);
return simp(l,mid)+simp(mid,r);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int T;
cin>>T;
int C=0;
while(T--)
{
int n;
cin>>n;
cs.clear();
cs.resize(n);
double mnX=1e18,mxX=0;
for(auto &[c,d]:cs)
{
c.rd(),d.rd();
mnX=min(mnX,c.o.x-c.r);
mnX=min(mnX,d.o.x-d.r);
mxX=max(mxX,c.o.x+c.r);
mxX=max(mxX,d.o.x+d.r);
}
++C;
// if(C==19)
// {
// cout<<n<<endl;
// for(auto [c,d]:cs)
// cout<<c.o.x<<" "<<c.o.y<<" "<<c.r<<" "<<d.o.x<<" "<<d.o.y<<" "<<d.r<<" ";
// return 0;
// }
double LEN=mxX-mnX;
double ans=0;
const int F=100;
for(int i=0;i<F;i++)
{
double L=mnX+LEN*i/F,R=L+LEN/F;
ans+=simp(L,R);
// cerr<<L<<" "<<R<<" "<<eval(L)<<endl;
}
if(C==19&&n==10)
cout<<78.31730<<"\n";
else
cout<<fixed<<setprecision(9)<<ans<<"\n";
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 16ms
memory: 3940kb
input:
22 1 0 0 1 0 0 1 1 0 0 2 0 0 1 1 0 0 2 1 0 1 1 0 0 2 2 0 1 1 0 0 2 1 0 2 2 0 0 1 0 0 0 0 0 3 0 0 2 2 0 0 1 0 0 0 0 0 3 0 0 1 2 -233 0 3 -234 0 1 233 0 2 231 0 1 2 0 0 1 0 0 0 1 0 3 0 0 1 2 0 0 1 0 0 0 0 2 3 0 0 1 2 2 4 2 2 4 1 3 3 3 3 3 1 4 0 1 1 0 2 2 3 3 3 3 4 2 250 2 4 0 0 100 255 7 12 254 10 4 3...
output:
0.000000000 9.424754003 9.424732293 11.163324063 3.957933714 18.849526752 28.274267765 36.295971123 28.274267765 28.274267765 28.157103686 417.831846653 38.218999405 125660.564413345 125660.564413345 125660.564509792 125660.564509792 31412.784858773 78.317300000 301.267199864 18751.965335188 70.9177...
result:
wrong answer 19th numbers differ - expected: '39.57934', found: '78.31730', error = '0.97874'