QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#640406 | #9434. Italian Cuisine | Dixiky_215 | WA | 3ms | 11576kb | C++20 | 4.1kb | 2024-10-14 11:50:49 | 2024-10-14 11:50:49 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const double eps=1e-11;
const int MAXN=5e5+7;
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator - (Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
Vector operator * (Vector A,double B){return Vector(A.x*B,A.y*B);}
Vector operator / (Vector A,double B){return Vector(A.x/B,A.y/B);}
int dcmp(double x){if(fabs(x)<eps)return 0;return (x>0)?1:-1;}
bool operator == (const Vector A,const Vector B){
return dcmp(A.x-B.x)==0 && dcmp(A.y-B.y)==0;
}
double Dot(Vector A,Vector B){return A.x*B.x+A.y*B.y;}
double Length(Vector A){return sqrt(Dot(A,A));}
double Cross(Vector A,Vector B){return A.x*B.y-B.x*A.y;}
double DistanceToSegment(Point P,Point A,Point B){
if(A==B)return Length(P-A);
Vector v1=B-A,v2=P-A,v3=P-B;
if(dcmp(Dot(v1,v2))<0)return Length(v2);
else if(dcmp(Dot(v1,v3))>0)return Length(v3);
else return fabs(Cross(v1,v2))/Length(v1);
}
double ComputePolygonArea(vector<Point> &points)
{
int point_num = points.size();
if(point_num < 3)return 0.0;
double s = points[0].y * (points[point_num-1].x - points[1].x);
for(int i = 1; i < point_num; ++i)
s += points[i].y * (points[i-1].x - points[(i+1)%point_num].x);
return fabs(s/2.0);
}
Point a[MAXN],be;
vector<Point> c;
int t;
int n;
double be_x,be_y,r;
double Distance(Point p,Point a,Point b)
{
Vector v1=b-a,v2=p-a;
return fabs(Cross(v1,v2));
}
bool check(Point P,Point A,Point B){
if(A==B)return 1;
Vector v1=B-A,v2=P-A,v3=P-B;
if(dcmp(Dot(v1,v2))<0)
{
if(Length(v2)>r||fabs(Length(v2)-r)<=eps) return 1;
return 0;
}
else if(dcmp(Dot(v1,v3))>0)
{
if(Length(v3)>r||fabs(Length(v3)-r)<=eps) return 1;
return 0;
}
else
{
if(fabs(Cross(v1,v2))>r*Length(v1)||fabs(fabs(Cross(v1,v2))-r*Length(v1))<=eps) return 1;
return 0;
}
}
bool check1(Point a,Point b,Point c)
{
__int128 res1=Cross(a,b),res2=Cross(a,c);
if(res1*res2<0) return 0;
return 1;
}
int main()
{
cin.tie(nullptr) ->sync_with_stdio(false);
cin>>t;
while(t--)
{
cin>>n;
cin>>be_x>>be_y>>r;
be={be_x,be_y};
for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
c.clear();
ll ans=0LL;
for(int i=1;i<=n;i++)
{
c.clear();
c.push_back(a[i]);
int j=i,numk=1;
int jj=i+1;
jj%=n;
if(jj==0) jj=n;
Point k1=be-a[i];
Point k2=a[jj]-a[i];
while(numk<n)
{
j++;numk++;
j%=n;
if(j==0) j=n;
if(!check(be,a[i],a[j])) break;
Point k3=a[j]-a[i];
if(!check1(k1,k2,k3)) break;
c.push_back(a[j]);
ans=max(ans,(ll) (ComputePolygonArea(c)*2.0));
}
// cerr<<i<<' '<<j-1<<" asd"<<endl;
// cout<<check(be,a[3],a[1])<<" asd"<<endl;
c.clear();
c.push_back(a[i]);
j=i;numk=1;
jj=i-1;
jj=(jj%n+n)%n;
if(jj==0) jj=n;
k1=be-a[i];
k2=a[jj]-a[i];
while(numk<n)
{
j--;numk++;
j=(j%n+n)%n;
if(j==0) j=n;
if(!check(be,a[i],a[j])) break;
Point k3=a[j]-a[i];
if(!check1(k1,k2,k3)) break;
c.push_back(a[j]);
ans=max(ans,(ll) (ComputePolygonArea(c)*2.0));
}
}
cout<<ans<<'\n';
}
return 0;
}
/*
*/
详细
Test #1:
score: 100
Accepted
time: 3ms
memory: 11572kb
input:
3 5 1 1 1 0 0 1 0 5 0 3 3 0 5 6 2 4 1 2 0 4 0 6 3 4 6 2 6 0 3 4 3 3 1 3 0 6 3 3 6 0 3
output:
5 24 0
result:
ok 3 number(s): "5 24 0"
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 11576kb
input:
1 6 0 0 499999993 197878055 -535013568 696616963 -535013568 696616963 40162440 696616963 499999993 -499999993 499999993 -499999993 -535013568
output:
286862654137719264
result:
wrong answer 1st numbers differ - expected: '0', found: '286862654137719264'