社区讨论
被卡精度了,试了好久
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 条回复,欢迎继续交流。
正在加载回复...