QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#679377#9434. Italian CuisinererebornzhouWA 0ms3776kbC++203.8kb2024-10-26 17:29:342024-10-26 17:29:35

Judging History

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

  • [2024-10-26 17:29:35]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3776kb
  • [2024-10-26 17:29:34]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef pair<int,int> pii;

const int N=3e5+10;

const double pi = acos(-1.0); //圆周率,精确到15位小数
const double eps = 1e-8; //浮点数偏差值

int sgn(double x){  //判断与0的大小关系
    if(fabs(x)<eps) return 0;
    return x<0?-1:1;
}

int dcmp(double x,double y){  //判断两个浮点数的大小关系
    if(fabs(x-y)<eps) return 0;
    else return x<y?-1:1;
}

struct Point{
    double x,y;
    Point(){}
    Point(double x,double y):x(x),y(y){}
    Point(Point a,Point b){  //向量
        x=b.x-a.x, y=b.y-a.y;
    }

    Point operator + (Point B){ return Point(x+B.x,y+B.y); }
    Point operator - (Point B){ return Point(x-B.x,y-B.y); }
    Point operator * (double k){ return Point(x*k,y*k); } //向量与实数的乘法
    Point operator / (double k){ return Point(x/k,y/k); } //向量与实数的除法
    bool operator == (Point B){ return sgn(x-B.x)==0 && sgn(y-B.y==0); } //两个向量判等
};

// 以下向量相关

typedef Point Vector; //用点的数据结构来表示向量

double Cross(Vector A,Vector B){ return A.x*B.y - A.y*B.x; } //向量叉积,有正负

//以下线相关
struct Line{
    Point p1,p2;  //直线上两点
    Line(){}
    Line(Point p1,Point p2):p1(p1),p2(p2){}
    Line(Point p,double angle){  //根据一个点和倾斜角确定直线,0<=angle<pi
        p1=p;
        if(sgn(angle-pi/2)==0) { p2 = (p1 + Point(0,1));} //tan(pi/2)不存在
        else { p2 = (p1 + Point(1,tan(angle)));}
    }
    Line(double a,double b,double c){  //ax+by+c=0
        if(sgn(a)==0){
            p1 = Point(0,-c/b);
            p2 = Point(1,-c/b);
        }
        else if(sgn(b)==0){
            p1 = Point(-c/b,0);
            p2 = Point(-c/b,1);
        }
        else{
            p1 = Point(0,-c/b);
            p2 = Point(1,(-c-a)/b);
        }
    }
};

double Distance_point(Point A,Point B){ return hypot(A.x-B.x,A.y-B.y); }  //两点之间的距离

double Dis_point_line(Point p,Line v){   //点到直线的距离
    return fabs((double)Cross(p-v.p1,v.p2-v.p1))/Distance_point(v.p1,v.p2);
}

struct Circle{  //圆的定义
    Point c;  //圆心
    double r;  //半径
    Circle(){}
    Circle(Point c,double r):c(c),r(r){}
	Circle(double x,double y,double r):c(Point(x,y)),r(r){}
};

int Line_circle_relation(Line v,Circle C){
    double dst = Dis_point_line(C.c,v);
    // cerr<<dst<<"\n";
    if(dst < C.r) return 0;  //0:直线和圆香蕉
    if(dst - C.r==0) return 1; //1:直线和圆相切
    return 2;                       //2:直线在圆外
}

void solve(){
    int n;
    cin>>n;
    int cx,cy,R;
    cin>>cx>>cy>>R;
    Circle C(Point(cx,cy),R);
    vector<Point> P;
    for(int i=1;i<=n;i++){
        int x,y;
        cin>>x>>y;
        P.push_back(Point(x,y));
    }
    for(int i=0;i<n;i++){
        P.push_back(P[i]);
    }

    auto check = [&](int i,int mid) -> bool {
        if(Cross(Vector(P[mid].x-P[i].x,P[mid].y-P[i].y),Vector(C.c.x-P[mid].x,C.c.y-P[mid].y))<0){
            return 0;
        }
        if(Line_circle_relation(Line(P[i],P[mid]),C)==0){
            return 0;
        }
        return 1;
    };
    int r=0;
    int area=0;
    int maxn=0;
    for(int l=0;l<n;l++){
        while(check(l,r+1)){
            area-=Cross(P[r],P[l]);
            area+=Cross(P[r],P[r+1]);
            area+=Cross(P[r+1],P[l]);
            r++;
        }
        maxn=max(abs(area),maxn);
        area-=Cross(P[r],P[l]);
        area-=Cross(P[l],P[l+1]);
        area+=Cross(P[r],P[l+1]);
    }
    cout<<maxn<<"\n";
}

signed main(){
    int T=1;
    cin>>T;
    while(T--){
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3628kb

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

input:

1
6
0 0 499999993
197878055 -535013568
696616963 -535013568
696616963 40162440
696616963 499999993
-499999993 499999993
-499999993 -535013568

output:

286862654137719296

result:

wrong answer 1st numbers differ - expected: '0', found: '286862654137719296'