QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#639988#9434. Italian CuisineDixiky_215WA 3ms13540kbC++204.6kb2024-10-14 01:13:402024-10-14 01:13:40

Judging History

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

  • [2024-10-14 01:13:40]
  • 评测
  • 测评结果:WA
  • 用时:3ms
  • 内存:13540kb
  • [2024-10-14 01:13:40]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const double eps=1e-18;
const int MAXN=5e5+7;                                                         
struct Point{                                                                        
    double x,y;                                                                      
    Point(double x=0,double y=0):x(x),y(y){}
};
typedef Point Vector;
Point a[MAXN],be;
vector<Point> c;
int t;
int n;
double be_x,be_y,r;
ll sum[MAXN];

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);                   
}
bool check2(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;
    }
}
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);
}

double Distance(Point p,Point a,Point b)
{
    Vector v1=b-a,v2=p-a;
    return fabs(Cross(v1,v2));
}
// bool check2(Point a,Point b)
// {
//     Point kkk={be_x,be_y};
//     if(Distance(kkk,a,b)<(r*abs(Length(b-a)))) return 0;
//     return 1;
// }
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;
}
ll work(int l,int r)
{
    ll res=sum[r]-sum[l];
    c.clear();
    c.push_back(a[1]);
    c.push_back(a[l]);
    c.push_back(a[r]);
    res-=(ll) (ComputePolygonArea(c)*2.0);
    return res;
}
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;
        for(int i=n+1;i<=2*n;i++) a[i]=a[i-n];
        
        sum[0]=sum[1]=sum[2]=0;
        for(int i=3;i<=n;i++)
        {
            c.clear();
            c.push_back(a[1]);
            c.push_back(a[i-1]);
            c.push_back(a[i]);
            sum[i]=sum[i-1]+(ll) (ComputePolygonArea(c)*2.0);
        }
        ll ans=0LL;
    
        for(int i=1;i<=n;i++)
        {
            int l=i,r=i+n-1,mid,loc=-1;
            Point k1=be-a[i];
            Point k2=a[i+1]-a[i];
            while(l<=r)
            {
                mid=(l+r)>>1;
                Point k3=a[mid]-a[i];
                if(check1(k1,k2,k3))
                {
                    if(check2(be,a[i],a[mid])) loc=mid,l=mid+1;
                    else r=mid-1;
                }
                else r=mid-1;
            }
            if(loc!=-1)
            {
                int lk=i%n,rk=loc%n;
                if(lk==0) lk=n;
                if(rk==0) rk=n;
                if(rk<lk)
                {
                    ll sum1=work(lk,n);
                    ll sum2=work(1,rk);
                    c.clear();
                    c.push_back(a[lk]);c.push_back(a[n]);
                    c.push_back(a[1]);c.push_back(a[rk]);
                    ll sumk=(ll) (ComputePolygonArea(c)*2.0);
                    
                    ans=max(ans,sum1+sum2+sumk);
                }
                else
                {
                    ans=max(ans,work(lk,rk));
                }
            }
        }
        cout<<ans<<'\n';
    }
    
    return 0;
}
/*

*/

详细

Test #1:

score: 100
Accepted
time: 3ms
memory: 12228kb

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: 13540kb

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'