A - Intersect Until You're Sick of It

Time Limit:500MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

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:
  1. Draw a line through every pair of different points.
  2. Find all intersections of all pairs of different non-parallel lines.
  3. 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 10 8.

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

input output
4
0 0
0 1
1 0
1 1

题意:给你n个不同的点,第一步,将任意两个点之间连成一条直线,第二步,直线相交可以形成新的点,然后再重复第一步,

问最后可以形成多少个点,如果无穷多个输出oo;

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <cstring>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; #define MM(a,b) memset(a,b,sizeof(a));
#define inf 0x7f7f7f7f
#define FOR(i,n) for(int i=1;i<=n;i++)
#define CT continue;
#define PF printf
#define SC scanf const int mod=1000000007;
const int N=1e5+10; struct Point{
ll x,y;
void read(){
scanf("%lld%lld",&x,&y);}
bool operator<(const Point &a) const{
if(this->x!=a.x) return this->x<a.x;
else return this->y<a.y;
}
}p[N]; Point operator-(Point a,Point b)
{
return (Point){a.x-b.x,a.y-b.y};
} ll det(Point a,Point b)
{
return a.x*b.y-b.x*a.y;
} int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) p[i].read();
if(n<=3) {printf("%d\n",n);return 0;}
sort(p+1,p+n+1);
if(n==4)
{
do
{
if(det(p[2]-p[1],p[4]-p[3])==0&&det(p[1]-p[4],p[2]-p[3])==0
&&det(p[3]-p[1],p[2]-p[1])!=0)
{printf("5\n");return 0;};
}while(next_permutation(p+1,p+n+1));
}
if(n==5)
{
do
{
if(det(p[2]-p[1],p[4]-p[3])==0&&det(p[1]-p[4],p[2]-p[3])==0&&
det(p[3]-p[1],p[2]-p[1])!=0&&det(p[4]-p[5],p[2]-p[5])==0&&
det(p[3]-p[5],p[1]-p[5])==0)
{printf("5\n");return 0;};
}while(next_permutation(p+1,p+n+1));
} for(int i=1;i<=2;i++)
for(int j=i+1;j<=4;j++)
{
int cnt=2;
for(int k=1;k<=n;k++) if(k!=i&&k!=j)
if(det(p[k]-p[i],p[k]-p[j])==0) cnt++;
if(cnt>=n-1) {printf("%d\n",n);return 0;}
}
printf("oo\n");
return 0;
}

 比赛分析:比赛时看到计算几何的题都不敢想,,,,比赛完了后稍微看了下题解,自己再想了想,发现水的一笔;

分析:看到题目时被吓到了,觉得情况好多,,心态很重要!

假设<=3个点,那么自己无论怎么排列,都不会形成新的点,所以就输出n;

如果是4个点,如果是平行四边形,,那么只能形成5个点;

如果是五个点,如果在是平行四边形的基础上,第五个点位于平行四边形的对角线上,那么最后也是五个点。

最后一个是比较特殊的情况,有n个点,假如n-1个点共线,一个点在直线外,那么答案就是n,但是

如果在直线外的点的个数>=2的话,那么就是oo了。

最后,因为要求点的全排列,需要用到next_permutation()函数:

1.因为point是自定义结构体,所以要定义点的优先级

2.next_permutation()函数使用前需要先对待排列数组排下序,利用sort从小到大排序

URAL 2036 Intersect Until You're Sick of It 形成点的个数 next_permutation()函数的更多相关文章

  1. 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 ...

  2. [转]数位dp小记

    转载自:http://blog.csdn.net/guognib/article/details/25472879 参考: http://www.cnblogs.com/jffifa/archive/ ...

  3. Array 数组的排序 sort

    JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序.sort() 方法用于对数组的元素进行排序.语法如下:arrayObject.sort(s ...

  4. T-SQL基础(四)之集合运算

    三个运算符 T-SQL支持三个集合运算符:UNION.INTERSECT.EXCEPT. 集合运算符查询的一般形式如下: Query1 <set_operator> Query2 -- 这 ...

  5. R语言函数总结(转)

    R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字符不允许是数字. 基本命令要么是表达 ...

  6. Ts基础

    //typeof 用来判断变量类型 var s: string = 'egret'; var isString: boolean = typeof s === 'string'; console.lo ...

  7. 【Ray Tracing in One Weekend 超详解】 光线追踪1-4

    我们上一篇写了Chapter5 的第一个部分表面法线,那么我们来学剩下的部分,以及Chapter6. Chapter5:Surface normals and multiple objects. 我们 ...

  8. [JS深入学习]——数组对象排序

    (转) JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序. sort() 方法用于对数组的元素进行排序.语法如下: arrayObject. ...

  9. 【R笔记】R语言函数总结

    R语言与数据挖掘:公式:数据:方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母).不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字 ...

随机推荐

  1. python使用xlutils库save()之后,文件损坏

    import xlrd from xlutils.copy import copyworkbook=xlrd.open_workbook('test.xlsx')##打开excel为 .xlsx格式w ...

  2. 关于vs code文本编辑器的快捷键

    另一篇编辑器Sublime Text下载.使用教程.插件推荐说明.全套快捷键 基础编辑 快捷键 作用 Ctrl+X 剪切 Ctrl+C 复制 Ctrl+Shift+K 删除当前行 Ctrl+Enter ...

  3. redis 学习(18)-- AOF

    redis -- AOF 什么是 AOF 通过日志方式将redis中的写命令进行日志记录,保存在硬盘文件中. 日志记录的实质是将写命令写在硬盘的缓冲区中,再根据相关策略把数据刷新到磁盘中. 当redi ...

  4. StoneTab标签页CAD插件 2.6.0

    1.纯属自娱自乐,未做过多的测试: 2.理论上可以用在CAD2010-2012版本,自己用的是WIN10 64位,CAD2012,其他未过测试: 3.尚未打算支持其他版本CAD,主要是电脑只能装WIN ...

  5. 文件名后面加(1).text

    ; //在重复名称后加(序号) while (File.Exists(path)) { if (path.Contains(").")) { int start = path.La ...

  6. Linux服务器不关机新增硬盘的方法

    在开机状态下,插入磁盘之后,执行如下命令: ls /sys/class/scsi_host/host0 host1 host2 echo "- - -" > /sys/cla ...

  7. centos7安装配置NFS文件共享存储

    一,环境介绍    本实验使用了两台centos7虚拟机,其中         服务器:192.168.1.188    客户端:192.168.1.189 二,实验步骤    192.168.1.1 ...

  8. win10上使用php与python实现与arduino串口通信

    注意: php 需要php7,安装及开启php_dio.dll com口按照实际的进行设置,如果不知道可以打开arduino编辑器进行查看 可以与用户实现命令行交互,但是效率过慢,不清楚如何优化,使用 ...

  9. iframe标签(页面嵌套)

    本文链接:https://blog.csdn.net/weixin_44540236/article/details/92760494 两个不同的页面但是它们的基本框架都是一样,每点击一次左边的导航栏 ...

  10. es6函数扩展(+ ...扩展运算符)

    1.参数默认值 function foo(param = 'nihao'){ console.log(param); } foo('hello kitty'); 2.参数解构赋值 function f ...