Ural 2036. Intersect Until You're Sick of It 计算几何
2036. Intersect Until You're Sick of It
题目连接:
http://acm.timus.ru/problem.aspx?space=1&num=2036
Description
Ural contests usually contain a lot of geometry problems. Many participants do not conceal their discontent with such disbalance. Still, we have decided not to break the tradition and give you an unbalanced contest. Let’s start!
Consider an iterative process for a set of points on a plane. Every iteration consists of three steps:
Draw a line through every pair of different points.
Find all intersections of all pairs of different non-parallel lines.
Merge the initial set of points with the set of intersection points and go to step one.
After each iteration, the number of points either increases or stays the same.
You are given a set of points. Iterations repeat while the number of points increases. How many points will be in the set after the end of this iterative process?
Input
The first line contains an integer n (1 ≤ n ≤ 100000). Further input describes n different points. For every point, you are given a pair of integer coordinates whose absolute value does not exceed 108.
Output
If the process is infinite, print “oo” (two lowercase Latin letters ‘o’), otherwise print the number of points in the set after the end of the process.
Sample Input
4
0 0
0 1
1 0
1 1
Sample Output
5
Hint
题意
给你n个点,然后进行下列操作:
1.两两点连线
2.找到所有不平行直线所构成的交点
3.把所有找到的点和原来的点合并,如果点数增加,再进行1操作;否则break
输出最后点的数量。
可能是无限多。
题解:
无限多的情况很多,我们来考虑特殊情况,即有解的:
显然所有点都是在一条直线上,这个答案是n
显然如果只有一个点不在直线上,这个答案也是n
有两个点不在直线上,那么答案可能是n,也有可能是n+1.
基本上情况就这些了,讨论一下,然后求解即可。
数据:
Anti-WA #51:
4
0 0
2 0
1 1
1 2
Answer: oo
Anti-WA #52:
4
0 0
1 2
2 2
3 0
Answer: oo
代码
#include <bits/stdc++.h>
using namespace std;
const int N=100010;
const int inf=1e9;
struct POINT
{
long long x;
long long y;
POINT(long long a=0, long long b=0) { x=a; y=b;} //constructor
bool operator<(const POINT &A)const{
if(A.x==x)return A.y<y;
return A.x<x;
}
};
long long multiply(POINT sp,POINT ep,POINT op)
{
return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));
}
long long multiply(POINT A,POINT B,POINT C,POINT D)
{
long long x1 = A.x-B.x;
long long y1 = A.y-B.y;
long long x2 = C.x-D.x;
long long y2 = C.y-D.y;
return x1*y2-x2*y1;
}
POINT P[N];
int n;
int solve(POINT st)
{
vector<POINT> ans,ret;
if(st.x==0&&st.y==0)
{
return inf;
}
for(int i=1;i<=n;i++)
{
if(multiply(P[i],st,P[1])!=0) ans.push_back(P[i]);else ret.push_back(P[i]);
}
if(ans.size()<=1)
{
return n;
}
else
{
for(int i=2;i<ans.size();i++)
if(multiply(ans[0],ans[1],ans[i])!=0) return inf;
for(int i=0;i<ret.size();i++)
if(multiply(ret[i],ans[1],ans[0])==0)
return n;
if(ans.size()>2)
{
return inf;
}
else
{
long long t1=multiply(ans[0],st,P[1]),t2=multiply(ans[1],st,P[1]);
if(t1>0&&t2>0||t1<0&&t2<0)
{
return inf;
}
else
{
POINT pp;
int flag=1,f1=1,f2=1;
for(int i=0;i<ret.size();i++)
{
if(multiply(ret[i],ans[1],ans[0])<0) f1=0;
if(multiply(ret[i],ans[1],ans[0])>0) f2=0;
}
if(f1||f2) flag=0;
return n+flag;
}
}
}
}
long long X(POINT A,POINT B){
return A.x*B.y-A.y*B.x;
}
long long sq(long long A){
return A*A;
}
long long dis(POINT A,POINT B){
return sq(A.x-B.x)+sq(A.y-B.y);
}
bool ok4(){
long long tmp = multiply(P[1],P[2],P[3],P[4]);
if(tmp!=0)return 0;
tmp = multiply(P[1],P[2],P[3]);
if(tmp==0)return 0;
long long dis1 = dis(P[1],P[2]);
long long dis2 = dis(P[3],P[4]);
if(dis1!=dis2)return 0;
return 1;
}
bool ok14(){
long long tmp = multiply(P[1],P[2],P[3]);
if(tmp==0)return 1;
long long dis1 = dis(P[1],P[2]);
long long dis2 = dis(P[3],P[4]);
if(dis1==dis2)return 1;
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%I64d%I64d",&P[i].x,&P[i].y);
}
for(int i=2;i<=n;i++)
P[i].x-=P[1].x,P[i].y-=P[1].y;
P[1].x=P[1].y=0;
int tmp=inf;
if(n<=3)
{
printf("%d\n",n);
return 0;
}
if(n==4){
sort(P+1,P+1+n);
do{
if(ok4()){
printf("5\n");
return 0;
}
}while(next_permutation(P+1,P+1+n));
sort(P+1,P+1+n);
do{
if(ok14()){
printf("4\n");
return 0;
}
}while(next_permutation(P+1,P+1+n));
printf("oo\n");
return 0;
}
if(n<=5)
{
for(int o=2;o<=n;o++)
{
tmp=min(tmp,solve(P[o]));
}
}
else
{
int flag=0;
POINT stt;
stt.x=stt.y=0;
for(int i=2;i<=6;i++)
{
for(int j=i+1;j<=6;j++)
{
for(int k=j+1;k<=6;k++)
if(multiply(P[i],P[j],P[1])==0&&multiply(P[i],P[k],P[1])==0)
{
stt=P[i];
flag=1;
break;
}
if(flag) break;
}
if(flag) break;
}
tmp=solve(stt);
}
if(tmp==inf) printf("oo\n");else printf("%d\n",tmp);
return 0;
}
Ural 2036. Intersect Until You're Sick of It 计算几何的更多相关文章
- URAL 2036 Intersect Until You're Sick of It 形成点的个数 next_permutation()函数
A - Intersect Until You're Sick of It Time Limit:500MS Memory Limit:65536KB 64bit IO Format: ...
- URAL 2025. Line Fighting (math)
2025. Line Fighting Time limit: 1.0 second Memory limit: 64 MB Boxing, karate, sambo- The audience i ...
- LINQ to SQL语句(8)之Concat/Union/Intersect/Except
适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1.简单形式: var q = ( from c in db ...
- 【oracle】union、union all、intersect、minus 的用法及区别
一.union与union all 首先建两个view create or replace view test_view_1 as as c from dual union as c from dua ...
- oracle之集合操作函数---minus、union、intersect
集合操作符专门用于合并多条select语句的结果,包括:UNION,UNION ALL,INTERSECT,MINUS.当使用集合操作函数时,需保证数据集的字段数据类型和数目一致. 使用集合操作符需要 ...
- LINQ的Intersect方法
找到两个集合中交集部分: source code: IEnumerable<int> a = new List<int>{ { }, { }, { } }; IEnumerab ...
- Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询
内连接查询 内连接与SqL中inner join一样,即找出两个序列的交集 Model1Container model = new Model1Container(); //内连接 var query ...
- List之Union(),Intersect(),Except()
http://www.cnblogs.com/qinpengming/archive/2012/12/03/2800202.html List之Union(),Intersect(),Except() ...
- Sql中的并(UNION)、交(INTERSECT)、差(minus)、除去(EXCEPT)详解
UNION 查询选修了180101号或180102号课程或二者都选修了的学生学号.课程号和成绩. (SELECT 学号, 课程号, 成绩 FROM 学习 WHERE 课程号='180101' ...
随机推荐
- bzoj千题计划257:bzoj4199: [Noi2015]品酒大会
http://www.lydsy.com/JudgeOnline/problem.php?id=4199 求出后缀数组的height 从大到小枚举,合并 维护组内 元素个数,最大.次大.最小.次小 # ...
- python 基础知识 列表的 增删改查 以及迭代取值
""" python 列表 通用方法 元组.数组.字典 取值方法 [] 列表中可以存储不同类型的数据 函数 封装了独立的功能可以直接调用 函数名(参数) 方法 和函数类似 ...
- html canvas非正方旋转和缩放...写的大多是正方的有人表示一直看正方的看厌了
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Oracle 查看锁表进程_杀掉锁表进程 [转]
查看锁表进程SQL语句1: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo ...
- linux 图形配置网络
命令:setup 打开网络等系统信息的图形配置 yyp复制 vi /etc/sysconfig/network-scripts/ifcfg-eth0 配置网络参数 重启网卡:/etc/init.d/n ...
- 常用 Git 命令清单【转】
转自:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 作者: 阮一峰 日期: 2015年12月 9日 我每天使用 Git ,但是 ...
- 高可用的MongoDB集群【转】
刚接触MongoDB,就要用到它的集群,只能硬着头皮短时间去看文档和尝试自行搭建.迁移历史数据更是让人恼火,近100G的数据文件,导入.清理垃圾数据执行的速度蜗牛一样的慢.趁着这个时间,把这几天关于M ...
- mac安装ocr
mac安装Tesserocr 安装 Imagemagick 和 Tesseract 库: brew install imagemagick brew install tesseract --all-l ...
- 爬虫、框架scrapy
阅读目录 一 介绍 二 安装 三 命令行工具 四 项目结构以及爬虫应用简介 五 Spiders 六 Selectors 七 Items 八 Item Pipeline 九 Dowloader Midd ...
- django startproject xxx:报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 13: ordinal not in range(128)
django startproject xxx:报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 13: o ...