社区讨论

被卡精度了,试了好久

CF613A Peter and Snow Blower参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lw7tx5b4
此快照首次捕获于
2024/05/15 20:59
2 年前
此快照最后确认于
2024/05/15 23:24
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define for1(i,a,b) for( int i=(a);i<=(b);i++)
#define for2(i,a,b) for( int i=(a);i<(b);i++)
#define for3(i,a,b) for( int i=(a);i>=(b);i--)
#define for4(i,a,b) for( int i=(a);i>(b);i--)
#define puba push_back
#define mem(a,b) memset((a),(b),sizof((a)))
#define int long long
using namespace std;
int n;
double x,y,xi[100005],yi[100005],maxr,minr=1e18;
double sq(double x){
    return x*x;
}
bool eq(double x,double y){
    if(fabs(x-y)<1e-6) return true;
    return false;
}
signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n>>x>>y;
    for1(i,1,n){
        cin>>xi[i]>>yi[i];
        maxr=max(maxr,sq(xi[i]-x)+sq(yi[i]-y));
    }
    xi[0]=xi[n];
    yi[0]=yi[n];
    for1(i,1,n){
        if(eq(xi[i],xi[i-1])){
            minr=min(minr,min(sq(xi[i]-x)+sq(yi[i]-y),sq(xi[i-1]-x)+sq(yi[i-1]-y)));
            continue;
        }else if(eq(yi[i],yi[i-1])){
            if(xi[i-1]<xi[i]){
                if(x<=xi[i-1]) minr=min(minr,sq(xi[i-1]-x)+sq(yi[i-1]-y));
                else if(x>=xi[i]) minr=min(minr,sq(xi[i]-x)+sq(yi[i]-y));
                else minr=min(minr,sq(fabs(yi[i]-y)));
            }else{
                if(x<=xi[i]) minr=min(minr,sq(xi[i]-x)+sq(yi[i]-y));
                else if(x>=xi[i-1]) minr=min(minr,sq(xi[i-1]-x)+sq(yi[i-1]-y));
                else minr=min(minr,sq(fabs(yi[i]-y)));
            }
        }else{
            double k=(yi[i]-yi[i-1])/(xi[i]-xi[i-1]);
            double b=yi[i]-k*xi[i];
            double k1=-1/k;
            double b1=y-k1*x;
            double xx=(b-b1)/(k1-k);
            double yy=k*xx+b;
            if(xi[i-1]<xi[i]){
                if(xx<=xi[i-1]) minr=min(minr,sq(xi[i-1]-x)+sq(yi[i-1]-y));
                else if(xx>=xi[i]) minr=min(minr,sq(xi[i]-x)+sq(yi[i]-y));
                else minr=min(minr,sq(xx-x)+sq(yy-y));
            }else{
                if(xx<=xi[i]) minr=min(minr,sq(xi[i]-x)+sq(yi[i]-y));
                else if(xx>=xi[i-1]) minr=min(minr,sq(xi[i-1]-x)+sq(yi[i-1]-y));
                else minr=min(minr,sq(xx-x)+sq(yy-y));
            }
        }
    }
    //cout<<minr<<" "<<maxr<<"\n";
    printf("%.20lf",3.1415926535897932385*(maxr-minr));
    
    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...