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

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;
}

  

转载于:https://www.cnblogs.com/chadinblog/p/6475825.html

[haoi2014]穿越封锁线相关推荐

  1. JZYZOJ1535 [haoi2014]穿越封锁线

    http://172.20.6.3/Problem_Show.asp?id=1535 整体来说是道水题,但是穿过点的判定把我坑得wa了两次,考场上这可是40分的水分啊啊啊. 开始的错误想法:排序后向上 ...

  2. P1535-HAOI2014【穿越封锁线】

    十分有趣的一道几何题,本来就繁琐的题,碰上本来就容易多想的蒟蒻的我...真是无力Orz 描述 Description   某敌战区是一个封闭的多边形,用相邻的顶点集合P1(x1,y1),P2(x2,y ...

  3. 一节计算机课日记,有趣的一节课小学日记300字

    第1篇:有趣的一节课小学日记300字 今天下午作文课上,老师让我们寻了一次"宝",老师在藏宝物之前要把我们请到厨房,在厨房我们高兴的一蹦三尺高,甚至开始想老师可能把宝物藏在哪儿!& ...

  4. 2012年复赛综合训练(一):第一题:nbsp;…

    第一题: 穿越封锁线(cross.pas/c/cpp) 题目描述: 对于窃取情报和破译密码,Feli简直就是天才! Feli知道我军3721整编军是我军一支重点培养的生力军,如果在这次行动中遭受损失, ...

  5. usaco Overfencing 穿越栅栏(BFS)

    Overfencing 穿越栅栏 农夫 John 在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出 了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个" ...

  6. 手机时间插件 支持分钟多选_手机时间慢十几分钟,我穿越了吗?

    如果有一天,你打开手机,发现显示时间与真实时间相差一刻钟左右,你会做什么?你会想到穿越吗?如果你想太久,可能会错过早晨通勤车,被早高峰堵住,因而迟到. 这件事发生在北京10月12日晚,部分市民发现时间 ...

  7. SIP穿越NATFireWall解决方案

    SIP穿越NAT&FireWall解决方案 SIP从私网到公网会遇到什么样的问题呢?<?xml:namespace prefix = o ns = "urn:schemas-m ...

  8. P2P网络“自由”穿越NAT的“秘密”

    P2P网络"自由"穿越NAT的"秘密"<?xml:namespace prefix = o ns = "urn:schemas-microsof ...

  9. 2013年4月工作小结 -- 穿越前的回眸

    有人说,每当离开一个项目都是一次穿越,每当进入一个项目都是一次重生.随着项目的尾声越来越近,我感觉到离自己穿越的日子越来越近了,然而我想在穿越之前,再回眸一次我们的项目.因为我不想让我的经验随着项目的 ...

最新文章

  1. vscode怎么用命令行打开本地项目(code .)
  2. SQL中几个比较重要的系统表
  3. 前端程序员如何选择适合自己的培训机构
  4. FU-A分包方式,以及从RTP包里面得到H.264数据和AAC数据的方法
  5. 数值计算算法-多项式插值算法的实现与分析
  6. Python3 写JSON数据到文件(多行格式化版)
  7. mysql 启动服务1067_windows无法启动MySQL服务报错1067的解决方法
  8. 7zip和winrar命令行备份
  9. [图灵程序设计丛书].持续交付:发布可靠软件的系统方法.pdf
  10. 二、套接字类型与协议设置
  11. EXCEL VBA常用代码集
  12. mnist数据集matlab导入,MNIST数据集转为matlab可读的mat格式
  13. Linux自学之旅-安装篇(格式化)
  14. PCBA加工为什么要做首件检测?
  15. 嵌入式入门学习的必要步骤
  16. word 单独设置正文页码
  17. 「GoTeam 招聘时间」传音移动互联 容器开发(上海)
  18. 笔记本电脑连接宽带的时候报错(调制解调器报告了一个错误)(1024程序节纪念一下自己的最坑)
  19. 彩色图像高频与低频成分的分解
  20. 手把手教你搭建深度学习环境

热门文章

  1. 仿qq跨三端app uni-app+springboot+mybatis+websocket(springboot+mybatis)
  2. 营养学基础知识计算机,计算机软件技术基础知识点储备(32页)-原创力文档
  3. 互联网晚报 | 11月6日 星期六 | 海尔创始人张瑞敏辞任董事局主席;海底捞将逐步关停300家门店;杭州亚运会设8个电竞项目...
  4. STM32F4ADC基础概述
  5. 基于JAVA消防安全应急培训管理平台计算机毕业设计源码+数据库+lw文档+系统+部署
  6. duckstation免费开源的ps1模拟器
  7. 全球及中国土壤修复行业十四五建设规划与发展商机研究报告2022-2027年
  8. 【芯片验证学习纪实】System Verilog语法(1)
  9. Kettle 转换与作业
  10. 本科学计算机专业当海军可以分配什么兵种,海军五大院校欢迎高中毕业生加入海军...