rt,给出输入数据
7
0 1
2 0
4 1
4 7
2 8
3 6
0 3
2 -1
当前题解会输出 3,而正确答案是 5。所以请求撤下。
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;
}