hack 当前题解并请求撤下 && 求调
查看原帖
hack 当前题解并请求撤下 && 求调
553625
scp020楼主2025/1/21 15:24

rt,给出输入数据

7 
0 1 
2 0
4 1
4 7
2 8
3 6
0 3 
2 -1

当前题解会输出 33,而正确答案是 55。所以请求撤下。

rt,我代码死了。WA on #6,8,求调。

#include<bits/stdc++.h>
int n,x,y;
const double eps=1e-8,pi=acos(-1);
struct point
{
	double x,y;
	point(){x=y=0x3f3f3f3f;}
	point(double x,double y){this->x=x,this->y=y;}
	inline point operator-(const point &rhs) const{return point(x-rhs.x,y-rhs.y);}
	inline double operator*(const point &rhs) const{return x*rhs.y-y*rhs.x;}
	inline bool operator==(const point &rhs) const{return fabs(x-rhs.x)<=eps && fabs(y-rhs.y)<=eps;}
	inline bool operator<(const point &rhs) const{return y+eps<rhs.y;}
};
inline int sgn(double x){return (fabs(x)<eps)?0:(x>0?1:-1);}
struct seg
{
	point s,t;
	inline seg(){}
	inline seg(point s,point t){this->s=s,this->t=t;}
	inline friend bool cross(const seg &lhs,const seg &rhs) // 线段
	{
		return std::max(lhs.s.x,lhs.t.x)>=std::min(rhs.s.x,rhs.t.x) && 
		std::max(lhs.s.y,lhs.t.y)>=std::min(rhs.s.y,rhs.t.y) && 
		std::max(rhs.s.x,rhs.t.x)>=std::min(lhs.s.x,lhs.t.x) && 
		std::max(rhs.s.y,rhs.t.y)>=std::min(lhs.s.y,lhs.t.y) && 
		sgn((rhs.s-lhs.s)*(lhs.t-lhs.s))*sgn((rhs.t-lhs.s)*(lhs.t-lhs.s))<0 && 
		sgn((lhs.s-rhs.s)*(rhs.t-rhs.s))*sgn((lhs.t-rhs.s)*(rhs.t-rhs.s))<0;
	}
	inline friend point calc(const seg &lhs,const seg &rhs) // 计算两直线交点
	{
		double ix,iy,rat;
		rat=(rhs.t-lhs.s)*(rhs.s-lhs.s)/((rhs.t-lhs.s)*(rhs.s-lhs.s)-(rhs.t-lhs.t)*(rhs.s-lhs.t));
		ix=lhs.s.x+(lhs.t.x-lhs.s.x)*rat,iy=lhs.s.y+(lhs.t.y-lhs.s.y)*rat;
		return point(ix,iy);
	}
};
point a[200];
seg b[100];
std::vector<point> v;
double ans;
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y),a[i+n]=a[i];
	scanf("%d%d",&x,&y);
	for(int i=1;i<=n;i++) b[i]=(seg){a[i],a[i+1]};
	for(int i=1;i<=n;i++)
		if(cross((seg){(point){x,y},(point){x,1100}},(seg){a[i],a[i+2]}) && a[i+1].x==x)
			v.push_back(a[i+1]);
	for(int i=1;i<=n;i++)
		if(cross((seg){(point){x,y},(point){x,1100}},b[i]))
			v.push_back(calc((seg){(point){x,y},(point){x,1100}},b[i]));
	std::sort(v.begin(),v.end());
	for(int i=0;i+1<v.size();i+=2) ans+=v[i+1].y-v[i].y;
	printf("%d",(int)ans);
	return 0;
}
2025/1/21 15:24
加载中...