有一个印章,其完全由线段构成。这些线段的线足够细可以忽略其宽度,就像数学上对线的定义一样,它们没有面积。现在给你一张巨大的白纸(10亿x10亿大小的纸,虽然这个纸很大,但是它的面积毕竟还是有限的),你可以在上面盖这个印章。要求盖印章时只能平移印章不能将其旋转,同时两次印章盖下的痕迹不能有交点(存在交点,指的是两次盖完印章后,可以从第一次的印章图案中取出一条线段,同时第二次的图案中也取出一条线段,且这两天线段相交)。给定印章中的图案,请判断是否有办法在这个有限的白纸上盖无限个章?存在输出"Infinite",否则输出"Finite".

提示:下图给出一些印章图案以及它们对应的结果。

Input
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5
每组测试数据有相同的结构构成。
每组数据的第一行包含一个整数N,表示印章中的线段条数,其中1<=N<=50
接下来N行每行四个整数ai,bi,ci,di,表示一条线段的两个端点(ai,bi)与(ci,di),其中-1000<=ai,bi,ci,di<=1000
Output
每组数据一行输出,存在无穷个印章的盖法输出"Infinite",否则输出"Finite".

这题卡精度。。。最好不要用浮点数。。。

答案为Infinite当且仅当存在一个方向,使印章在此方向平移一个极小(趋向于0)的距离后不与自身相交,而每对仅在端点相交的线段就确定了两个方向区间,不能向区间内方向平移,离散化,排序扫一次就可以确定是否有满足要求的方向存在
#include<cstdio>
#include<algorithm>
struct vec{
int x,y;
void fix(){
if(y<||y==&&x<)x=-x,y=-y;
}
};
vec operator+(vec a,vec b){return (vec){a.x+b.x,a.y+b.y};}
vec operator-(vec a,vec b){return (vec){a.x-b.x,a.y-b.y};}
int operator*(vec a,vec b){return a.x*b.y-a.y*b.x;}
bool operator==(vec a,vec b){return a.x==b.x&&a.y==b.y;}
struct seg{
vec a,b;
void scan(){
scanf("%d%d%d%d",&a.x,&a.y,&b.x,&b.y);
}
void swap(){
std::swap(a,b);
}
bool isp(){
vec c=a-b;
return !(c.x|c.y);
}
}ss[];
int ep,sum,cnt;
int sgn(int x){
return x>?:x<?-:;
}
bool cross(seg a,seg b){
return
sgn((b.a-a.a)*(a.b-a.a))*sgn((b.b-a.a)*(a.b-a.a))+
sgn((a.a-b.a)*(b.b-b.a))*sgn((a.b-b.a)*(b.b-b.a))<;
}
bool pal(seg a,seg b){
return (a.b-a.a)*(b.b-b.a)==;
}
struct event{
vec x;int v;
}es[];
bool operator<(event a,event b){
int c=a.x*b.x;
return c?c>:a.v<b.v;
}
void chk(seg a,seg b){
if(a.a==b.b)b.swap();
if(a.b==b.a)a.swap();
if(a.b==b.b)a.swap(),b.swap();
if(a.a==b.a){
vec p1=a.b-a.a,p2=b.b-b.a;
if(p1*p2<)std::swap(p1,p2);
p1.fix();p2.fix();
if(p1*p2<)++sum;
++cnt;
es[ep++]=(event){p1,};
es[ep++]=(event){p2,-};
}
}
int T,n;
int main(){
scanf("%d",&T);
while(T--){
ep=;sum=cnt=;
scanf("%d",&n);
for(int i=;i<n;i++)ss[i].scan();
int is=;
for(int i=;i<n;i++)for(int j=;j<i;j++){
if(ss[i].isp()||ss[j].isp())continue;
if(pal(ss[i],ss[j]))continue;
if(cross(ss[i],ss[j])){
is=;
i=n;
break;
}
chk(ss[i],ss[j]);
}
if(is){
std::sort(es,es+ep);
for(int i=;i<ep;i++){
if((sum+=es[i].v)==cnt){
is=;
break;
}
}
}
puts((is==||is==&&!cnt)?"Infinite":"Finite");
}
return ;
}

51nod1369 无穷印章的更多相关文章

  1. C#如何在PDF文件添加图片印章

    文档中添加印章可以起一定的作用,比如,防止文件随意被使用,或者确保文档内容的安全性和权威性.C#添加图片印章其实也有很多实现方法,这里我使用的是免费的第三方软件Free Spire.PDF,向大家阐述 ...

  2. ASP.NET Identity 2新增双重认证、帐号锁定、防伪印章功能并修复了一些bug

    Microsoft最近发布了ASP.NET Identity 2,该版本支持双重认证.帐号锁定以及防伪印章功能,还增强了用户帐号和索引.此外新版本还包含一个改进的密码验证器并修复了一些bug. 借助于 ...

  3. python的正负无穷float("inf")的用法

    今天,在看书的时候看到这么一个例子: 这是用来求解 从某个数字列表中找出俩个彼此最接近但是不相等的数(俩者之间的绝对差是最小的): >>> from random import ra ...

  4. Scalaz(50)- scalaz-stream: 安全的无穷运算-running infinite stream freely

    scalaz-stream支持无穷数据流(infinite stream),这本身是它强大的功能之一,试想有多少系统需要通过无穷运算才能得以实现.这是因为外界的输入是不可预料的,对于系统本身就是无穷的 ...

  5. 无穷滚动(Infinite scroll)的实现原理

    1 无穷滚动(无限加载)与分页的比较 现在越来越多的网站或者博客的列表页开始抛弃传统的分页技术,大致的原因在于,分页明显地增加了用户的操作行为以及页面加载等待的时间,而网页浏览者往往没什么耐心. 而无 ...

  6. 泛函编程(13)-无穷数据流-Infinite Stream

    上节我们提到Stream和List的主要分别是在于Stream的“延后计算“(lazy evaluation)特性.我们还讨论过在处理大规模排列数据集时,Stream可以一个一个把数据元素搬进内存并且 ...

  7. JavaScript和html5 canvas生成圆形印章

    代码: function createSeal(id,company,name){ var canvas = document.getElementById(id); var context = ca ...

  8. html5 canvas绘制圆形印章,以及与页面交互

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Python 关于正负无穷float(‘inf’)的一些用法

    Python中可以用如下方式表示正负无穷: float("inf"), float("-inf") 利用 inf 做简单加.乘算术运算仍会得到 inf > ...

随机推荐

  1. HttpResponse的Close和End 区别

    转载自:http://blog.sina.com.cn/s/blog_702c390c0100mlhi.html 最近启用了IIS上的压缩功能,但是测试系统上某模块变得不可用了.该模块采用AJAX技术 ...

  2. ABAP 使用的字符类型

    1.ABAP基本数据类型 类型        描述                属性 C            字符类型           默认长度1,最大长度不限N            数字类 ...

  3. 160. Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...

  4. tomcat 启动时内存溢出

    在tomcat_home/bin目录下找到catalina.bat,用文本编辑器打开,加上下面一行: set JAVA_OPTS= -Xms1024M -Xmx1024M -XX:PermSize=2 ...

  5. Android TouchEvent事件传递机制

    本文转载自:http://blog.csdn.net/morgan_xww/article/details/9372285 跟touch事件相关的3个方法: public boolean dispat ...

  6. spring源码学习之:spring容器的applicationContext启动过程

    Spring 容器像一台构造精妙的机器,我们通过配置文件向机器传达控制信息,机器就能够按照设定的模式进行工作.如果我们将Spring容器比喻为一辆汽车,可以将 BeanFactory看成汽车的发动机, ...

  7. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

  8. 代码里面执行bat

    public static void executeBat(String path) {        try {            File file = new File(path);     ...

  9. easyUI之datebox

    datebox具有输入的文本框及点击出现日历面板选择器的功能. 此组件的加载方式有class及jq方式,加载后,进行简单的属性设置即可. 对于此属性有一个很好的用法shareCalendar,就是多输 ...

  10. dl,dt,dd,ul,li,ol区别

    dl.dt.dd也是列表项,不过它们被忽视得比较厉害,人们只知道ul.ol.li,却经常漠视它们的存在,其实有时候,dl.dt.dd也是非常好用的,这两个家族是近亲,很多地方都是一模一样. dl类似u ...