这题需要注意的一点是射线法需要考虑边界,而且题目对边界的限制极为严格.

dcmp(v[i%n].x-x)<=0&&dcmp(v[(i+1)%n].x-x)>0
dcmp(v[i%n].x-x)>0&&dcmp(v[(i+1)%n].x-x)<=0

这是我写的版本.

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cmath>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<iomanip>
using namespace std;
#define LL long long
#define up(i,j,n) for(int i=j;i<=n;i++)
#define pii pair<int,int>
#define db double
#define eps 1e-4
#define FILE "dealing"
int read(){
int x=0,f=1,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0',ch=getchar();}
return x*f;
}
const int maxn=22000,inf=1000000000;
bool cmin(db& a,db b){return a>b?a=b,true:false;}
int n;
struct vec {
db x,y;
vec(db x=0,db y=0):x(x),y(y){}
}v[maxn];
int dcmp(db v){if(fabs(v)<eps)return 0;return v<0?-1:1;}
db x,y;
db s[5];
db gety(vec v,vec b,db x){
db k=(b.y-v.y)/(b.x-v.x);
db d=v.y-v.x*k;
return x*k+d;
}
int main(){
freopen(FILE".in","r",stdin);
freopen(FILE".out","w",stdout);
n=read();
up(i,0,n-1)v[i].x=read(),v[i].y=read();
x=read(),y=read();
int wn=1;db ans=0,last=y;
db Min=inf;int k=0;
up(i,0,n-1)
if(((v[i%n].x<x&&v[(i+1)%n].x>x)||(v[i%n].x>x&&v[(i+1)%n].x<x))&&gety(v[i%n],v[(i+1)%n],x)>y&&cmin(Min,gety(v[i],v[(i+1)%n],x)-y)){k=i;}
up(i,k,k+n-1){
if(dcmp(v[i%n].x-x)<=0&&dcmp(v[(i+1)%n].x-x)>0&&dcmp(gety(v[i%n],v[(i+1)%n],x)-y)>0){
s[wn]+=gety(v[i%n],v[(i+1)%n],x)-last;
last=gety(v[i%n],v[(i+1)%n],x);
wn++;
}
else if(dcmp(v[i%n].x-x)>0&&dcmp(v[(i+1)%n].x-x)<=0&&dcmp(gety(v[i%n],v[(i+1)%n],x)-y)>0){
s[wn]+=gety(v[i%n],v[(i+1)%n],x)-last;
last=gety(v[i%n],v[(i+1)%n],x);
wn--;
}
}
if(wn==1)printf("%d\n",(int)fabs(s[2]+s[0]));
else printf("%d\n",fabs(s[1]));
return 0;
}

  

最新文章

  1. Sprint 2
  2. Charles
  3. 菜单each+hover
  4. WinForm中新开一个线程操作 窗体上的控件(跨线程操作控件)
  5. [三]ajax重要属性
  6. R-大数据分析挖掘(4-R爬虫实现)
  7. java网络之tcp
  8. dubbo个人总结
  9. HTML5基本知识点
  10. java 日期格式处理
  11. 【转载】系统吞吐量(TPS)、用户并发量、性能测试概念和公式
  12. 使用matlab自带工具实现rcnn
  13. SQL Server中row_number的用法
  14. hadoop 用户
  15. Fedora16的双显卡切换问题
  16. .Net Core连接RabbitMQ集群
  17. error nr.1045 access denied for user &#39;root&#39;@&#39;localhost&#39; (using passwd:no)
  18. 10 Maven 版本管理
  19. Django-模板继承、包含和静态文件配置
  20. 20155226 2016-2017-2 《Java程序设计》第4周学习总结

热门文章

  1. C# 根据生日获取年龄
  2. Jython中文乱码问题
  3. ubuntu 卸载干净软件(包括配置文件)
  4. Android自己定义实现循环滚轮控件WheelView
  5. iOS 推送 获取手机设备的 deviceToken
  6. 1079. Total Sales of Supply Chain (25)【树+搜索】——PAT (Advanced Level) Practise
  7. java实验8-Java输入输出流
  8. loarocks install loadcaffe 失败
  9. c和c++的输入输出
  10. kubernetes调度之资源配额