QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#640406#9434. Italian CuisineDixiky_215WA 3ms11576kbC++204.1kb2024-10-14 11:50:492024-10-14 11:50:49

Judging History

你现在查看的是最新测评结果

  • [2024-10-14 11:50:49]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:11576kb
  • [2024-10-14 11:50:49]
  • 提交

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'