【codejam2015 Round1A】C Logging

Problem

A certain forest consists of N trees, each of which is inhabited by a squirrel.

The boundary of the forest is the convex polygon of smallest area which contains every tree, as if a giant rubber band had been stretched around the outside of the forest.

Formally, every tree is a single point in two-dimensional space with unique coordinates (Xi, Yi), and the boundary is the convex hull of those points.

Some trees are on the boundary of the forest, which means they are on an edge or a corner of the polygon. The squirrels wonder how close their trees are to being on the boundary of the forest.

One at a time, each squirrel climbs down from its tree, examines the forest, and determines the minimum number of trees that would need to be cut down for its own tree to be on the boundary. It then writes that number down on a log.

Determine the list of numbers written on the log.

Input

The first line of the input gives the number of test cases, T. T test cases follow; each consists of a single line with an integer N, the number of trees, followed by N lines with two space-separated integers Xi and Yi, the coordinates of each tree. No two trees will have the same coordinates.

Output

For each test case, output one line containing “Case #x:”, followed by N lines with one integer each, where line i contains the number of trees that the squirrel living in tree i would need to cut down.

Limits

-106 ≤ Xi, Yi ≤ 106.

Small dataset

1 ≤ T ≤ 100.

1 ≤ N ≤ 15.

Large dataset

1 ≤ T ≤ 14.

1 ≤ N ≤ 3000.

Sample

Input

Output

2

5

0 0

10 0

10 10

0 10

5 5

9

0 0

5 0

10 0

0 5

5 5

10 5

0 10

5 10

10 10

Case #1:

0

0

0

0

1

Case #2:

0

0

0

0

3

0

0

0

0

In the first sample case, there are four trees forming a square, and a fifth tree inside the square. Since the first four trees are already on the boundary, the squirrels for those trees each write down 0. Since one tree needs to be cut down for the fifth tree to be on the boundary, the fifth squirrel writes down 1.

简述一下题目:

平面上有一些点,问删除掉那些点才能使得某一个点成为凸包边界上的点。

一个点成为凸包上的点的充要条件是:

过该点的某一条直线的一侧没有点。

那么我们枚举每一个点,然后以这个点为原点建系,并将其他点极角排序。

然后只要用一条直线按照极角序转一圈,计算出一侧最少的点即可。

如何极角排序呢?

①需要用到C++中的函数atan2(y,x):

简单来说就是从第三象限开始,逆时针递增

②还有一种方法是看象限,然后用叉积算。

int cmp(const point&a,const point&b){
    if(a==b)return 0;
    int s1=(a.y<=0 && a.x<=0 || a.y<0);
    int s2=(b.y<=0 && b.x<=0 || b.y<0);
    if(s1!=s2)return s1>s2;
    return a*b>0;
}

代码:O(n2logn)

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define eps 1e-9
#define Pi acos(-1)
using namespace std;
int x[3005],y[3005],T,N;
double a[6005];
int main()
{
    cin>>T;
    for (int t=1;t<=T;t++)
    {
        printf("Case #%d:\n",t);
        scanf("%d",&N);
        for (int i=1;i<=N;i++)
            scanf("%d%d",&x[i],&y[i]);
        for (int i=1;i<=N;i++)
        {
            int n=0;
            for (int j=1;j<=N;j++)
                if (i!=j)
                    a[++n]=atan2(y[j]-y[i],x[j]-x[i]);
            sort(a+1,a+1+n);
            for (int j=1;j<=n;j++)
                a[j+n]=a[j]+2*Pi;
            int j=1,ans=n;
            for (int k=1;k<=n;k++)
            {
                j=max(k,j);
                while (a[j+1]<a[k]+Pi-eps)
                    j++;
                ans=min(ans,j-k);
            }
            cout<<ans<<endl;
        }
    }
    return 0;
}
时间: 2024-10-07 05:45:41

【codejam2015 Round1A】C Logging的相关文章

【POJ 2417】 Discrete Logging

[题目链接] http://poj.org/problem?id=2417 [算法] Baby-Step,Giant-Step算法 [代码] #include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <

【Python系列】Python自动发邮件脚本

缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月,看看效果再拓展吧. 脚本主要是通过Python写的,调的smtplib库,这些是基础,大家在网上一搜一大堆,今天主要给大家讲解下如何避免进入垃圾邮件系统,以及整个系统搭建时的一些思想.可能刚搞Python不久,有很多可能是错误的写法望大家提出来哈~ 配置 CentOS7.0系统 Python 3.4

【十四】注入框架RoboGuice使用总结

在我们平时开发Android项目的时候例如经常需要使用各种View控件,然后进行声明,findViewById,并且进行强转.每次都要写这样的代码就显得非常繁琐,并且容易出错哦.那么针对这种情况且不限定于以上的这类情况,Dependency injection 可以大大降低了类之间的依赖性,可以通过annotation (Java)描述类之间的依赖性,避免了直接调用类似的构造函数或是使用Factory来参加所需的类,从而降低类或模块之间的耦合性,以提高代码重用并增强代码的可维护性.Google

【等待事件】等待事件系列(5.1)--Enqueue(队列等待)

[等待事件]等待事件系列(5.1)--Enqueue(队列等待)   1  BLOG文档结构图   2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Enqueue队列等待 ② Enq数据字典 ③ enq: AE - lock ④ enq: MR锁 ⑤ enq: DX - contention ⑥ enq: SQ - contention 序列等待     2.2  相关参考文章链接 [推

【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较

[知识点整理]Oracle中NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 系统和会话级别的REDO和UNDO量的查询 ② NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较(重点)   Tips: ① 本文

【数据库摘要】10_Sql_Create_Index

CREATE INDEX 语句 CREATE INDEX 语句用于在表中创建索引. 在不读取整个表的情况下,索引使数据库应用程序可以更快地查找数据. 索引 您可以在表中创建索引,以便更加快速高效地查询数据. 用户无法看到索引,它们只能被用来加速搜索/查询. 注释:更新一个包含索引的表需要比更新一个没有索引的表花费更多的时间,这是由于索引本身也需要更新.因此,理想的做法是仅仅在常常被搜索的列(以及表)上面创建索引. SQL CREATE INDEX 语法 在表上创建一个简单的索引.允许使用重复的值

【游戏开发】Netty TCP粘包/拆包问题的解决办法(二)

上一篇:[Netty4.X]Unity客户端与Netty服务器的网络通信(一) 一.什么是TCP粘包/拆包 如图所示,假如客户端分别发送两个数据包D1和D2给服务端,由于服务端一次读取到的字节数是不确定的,故可能存在以下4中情况: 第一种情况:Server端分别读取到D1和D2,没有产生粘包和拆包的情况. 第二种情况:Server端一次接收到两个数据包,D1和D2粘合在一起,被称为TCP粘包. 第三种情况:Server端分2次读取到2个数据包,第一次读取到D1包和D2包的部分内容D2_1,第二次

【MySQL案例】ERROR 1665 (HY000)

1.1.1. ERROR 1665 (HY000) [环境描述] msyql5.6.14 [报错信息] 执行SQL语句的时候报错: ERROR 1665 (HY000): Cannot executestatement: impossible to write to binary log since BINLOG_FORMAT = STATEMENTand at least one table uses a storage engine limited to row-based logging.

【MySQL案例】ERROR 1418

1.1.1. ERROR 1418 [环境描述] mysql5.0.67 [问题描述] 创建存储过程的时候遇到ERROR 1418报错. # 创建函数的SQL语句 CREATE FUNCTION `xxx`( num01 int ) RETURNSint(11) begin declare mm  int default 0; if  (xx) then set mm = num01*num01*10; elseif  xxx then set mm = 10; else case num01