QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#504967 | #9103. Zayin and Fireball | Afterlife# | TL | 741ms | 3868kb | C++20 | 3.4kb | 2024-08-04 17:56:10 | 2024-09-23 15:04:05 |
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;
const int F=10000;
for(int i=0;i<F;i++)
{
double L=mnX+LEN*i/F,R=L+LEN/F;
ans+=simp(L,R);
}
cout<<fixed<<setprecision(9)<<ans<<"\n";
}
}
详细
Test #1:
score: 100
Accepted
time: 741ms
memory: 3868kb
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.424777771 9.424777771 11.163304042 3.957933714 18.849551616 28.274332421 36.296023273 28.274332421 28.274332421 28.157135613 417.831803287 38.218849140 125660.564550772 125660.564550772 125660.564788016 125660.564788016 31412.784939855 39.579336023 301.267441066 18751.965614304 70.9137...
result:
ok 22 numbers
Test #2:
score: -100
Time Limit Exceeded
input:
30 500 129 442 8 147 446 7 131 405 28 110 416 4 164 446 3 146 456 0 166 453 20 152 423 24 100 417 25 164 439 5 119 425 7 115 420 19 127 408 5 107 423 18 157 449 18 148 444 16 178 392 10 134 456 27 162 419 25 124 456 15 133 425 6 119 444 16 132 412 5 127 464 28 139 373 19 148 414 9 114 425 2 117 431 ...