QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#504964 | #9103. Zayin and Fireball | Afterlife# | TL | 19ms | 3864kb | C++20 | 3.4kb | 2024-08-04 17:55:42 | 2024-08-04 17:55:42 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
const int N=5e2+1e1+7;
const double eps=1e-6;
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 Len(const double d) const
{
return {x*d,y*d};
}
P operator *(const double d) const
{
return {x*d,y*d};
}
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(sqrt(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,1},v={X,0};
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;
}
}
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))<0.00001)
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;
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);
}
double LEN=mxX-mnX;
double ans=0;
for(int i=0;i<100;i++)
{
double L=mnX+LEN*i/100,R=L+LEN/100;
ans+=simp(L,R);
}
cout<<fixed<<setprecision(9)<<ans<<"\n";
}
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 19ms
memory: 3864kb
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.424774785 9.424772071 11.163306528 3.957933714 18.849541148 28.274324214 36.296001787 28.274324214 28.274324214 28.157138788 417.831826785 38.218869149 125660.564523860 125660.564523860 125660.564759827 125660.564759827 31412.784927277 39.579331978 301.267432982 18751.965583975 70.9142...
result:
wrong answer 19th numbers differ - expected: '78.31730', found: '39.57933', error = '0.49463'