4246: 两个人的星座

Time Limit: 40 Sec  Memory Limit: 256 MB
Submit: 101  Solved: 55
[Submit][Status][Discuss]

Description

JOI酱和IOI酱是好朋友。某天,JOI酱与IOI酱决定去山上的某个展望台进行天体观测。
从展望台上可以观测到N颗星星,编号为1...N。每颗星星的颜色为红色、蓝色、黄色中的一种。
在展望台上观测到的星星可以用坐标系上的点来表示。在坐标系上,星i(1<=i<=N)对应的点为Pi(Xi,Yi)。坐标系上的点两两不同,且不存在三点共线。
JOI酱和IOI酱想要设立一个叫做“JOIOI座”的星座。首先。两个人决定使用红色、蓝色、黄色三种颜色的星各一个构成的三角形。他们将这样的三角形称作“好三角形”。
两人将满足以下条件的好三角形无序二元组作为JOIOI座的候补:
两个三角形没有公共点(包括内部和边界)。换言之,两个三角形之间既不相交,也不存在某个三角形包含另一个三角形。
 
JOI酱和IOI酱想知道构成JOIOI座的候补一共有多少种方案。
注意如果构成三角形的6个点一样但是构成三角形的方式不同,算作不同的方案。
现在给出展望台上能观测到的星星的信息,请求出构成JOIOI座的候补一共有多少种方案

Input

第一行一个整数N,代表展望台上能观测到的星星的数量。
接下来N行,第i行(1<=i<=N)有三个空格分隔的整数Xi,Yi,Ci,表示星i的坐标为Pi(Xi,Yi),Ci表示星i的颜色,其中0代表红色,1代表蓝色,2代表黄色。

Output

输出一行一个整数,表示JOIOI座候补的方案数。

Sample Input

7
0 0 0
2 0 1
1 2 2
-2 1 0
-2 -3 0
0 -2 1
2 -2 2

Sample Output

4

HINT

样例中,JOIOI的候补有以下四种方案:
 
6<=N<=3000
-10^5<=Xi<=10^5(1<=i<=N)
-10^5<=Yi<=10^5(1<=i<=N)
0<=Ci<=2(1<=i<=N)
每种颜色的星至少存在一个
Pi≠Pj(1<=i<j<=N)
Pi,Pj,Pk不共线(1<=i<j<k<=N)
请注意你的常数

Source

[Submit][Status][Discuss]

相离则显然能被公切线分割,枚举+极交排序即可。

https://blog.csdn.net/lych_cys/article/details/51000549

排序不要写cmp,写到结构体里去,记得传变参!

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
#define ll long long
using namespace std; const int N=;
const double Pi=acos(-.);
int n,s,c[][],bl[N];
struct P{
int x,y,c,id; double k;
bool operator < ( const P &b ) const { return k < b.k; }
}p[N]; int main(){
scanf("%d",&n);
rep(i,,n) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].c),p[i].id=i;
P o; ll tmp,ans=;
rep(i,,n){
rep(j,,n) if (p[j].id==i) { s=j; break; }
o=p[s]; int k=o.c;
rep(j,,n){
p[j].k=(p[j].id!=i) ? atan2(p[j].y-o.y,p[j].x-o.x) : 1e9;
if (p[j].k<=) p[j].k+=Pi;
}
sort(p+,p+n+); memset(c,,sizeof(c));
rep(j,,n-)
if (p[j].y<o.y || (p[j].y==o.y && p[j].x>o.x))
c[bl[j]=][p[j].c]++; else c[bl[j]=][p[j].c]++;
rep(j,,n-){
c[bl[j]][p[j].c]--; tmp=;
if (k) tmp*=c[][]; if (p[j].c) tmp*=c[][];
if (k^) tmp*=c[][]; if (p[j].c^) tmp*=c[][];
if (k^) tmp*=c[][]; if (p[j].c^) tmp*=c[][];
ans+=tmp; tmp=;
if (k) tmp*=c[][]; if (p[j].c) tmp*=c[][];
if (k^) tmp*=c[][]; if (p[j].c^) tmp*=c[][];
if (k^) tmp*=c[][]; if (p[j].c^) tmp*=c[][];
ans+=tmp; c[bl[j]^=][p[j].c]++;
}
}
printf("%lld\n",ans>>);
return ;
}

[BZOJ4246]两个人的星座(计算几何)的更多相关文章

  1. LOJ2882 JOISC2014 两个人的星座 计算几何

    传送门 一件值得注意的事情是:平面上两个不相交的三角形一定会存在两条公切线 那么我们可以枚举三角形的公切线,计算有多少个三角形的公切线之一为该线,所有的答案除以2就是我们要求的答案. 考虑如何去计算有 ...

  2. LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)

    题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...

  3. 「JOISC 2014 Day4」两个人的星座

    首先突破口肯定在三角形不交,考虑寻找一些性质. 引理一:两个三角形不交当且仅当存在一个三角形的一条边所在直线将两个三角形分为异侧 证明可以参考:三角形相离充要条件,大致思路是取两个三角形重心连线,将其 ...

  4. AHOI2018训练日程(3.10~4.12)

    (总计:共90题) 3.10~3.16:17题 3.17~3.23:6题 3.24~3.30:17题 3.31~4.6:21题 4.7~4.12:29题 ZJOI&&FJOI(6题) ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. 杭电ACM分类

    杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...

  7. 转载:hdu 题目分类 (侵删)

    转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...

  8. BZOJ 4236~4247 题解

    BZOJ 4236 JOIOJI f[i][0..2]表示前i个字符中′J′/′O′/′I′的个数 将二元组<f[i][0]−f[i][1],f[i][1]−f[i][2]>扔进map,记 ...

  9. 巩固复习(Hany驿站原创)_python的礼物

    Python编程语言简介 https://www.cnblogs.com/hany-postq473111315/p/12256134.html Python环境搭建及中文编码 https://www ...

随机推荐

  1. 【BZOJ】3502 PA2012 Tanie linie

    [算法]贪心,一般DP [题解] --- 胡策k≤10的环状DP做法: 1.钦定法:先确定第一位(可能和第n位)的状态,然后后面正常做DP,显然正确答案是一定会被记录的,因为从整体上看不会有影响. 2 ...

  2. poj 1062 昂贵的聘礼 (dijkstra最短路)

    题目链接:http://poj.org/problem?id=1062 昂贵的聘礼 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

  3. 金融分析二:Matplotlib模板

    Matplotlib:绘图和可视化 Matplotlib是一个强大的Python绘图和数据可视化的工具包. 安装方法:pip install matplotlib 引用方法:import matplo ...

  4. linux下pthread_cancel无法取消线程的原因【转】

    转自:http://blog.csdn.net/huangshanchun/article/details/47420961 版权声明:欢迎转载,如有不足之处,恳请斧正. 一个线程可以调用pthrea ...

  5. Linux汇编教程02:编写第一个汇编程序

    学习一门语言,最好的方式就是在运用中学习,那么在这一章节中,我们开始编写我们的第一个汇编程序.当然作为第一个程序,其实十分的简单,但可以给大家一个基本的轮廓,了解汇编大概是这样的. 我们这个程序实际上 ...

  6. 【转】Android - Binder机制

    以下几篇文章是分析binder机制里讲得还算清楚的 目录 1. Android - Binder机制 - ServiceManager 2. Android - Binder机制 - 普通servic ...

  7. C#利用WinRAR实现压缩和解压缩

    using System; using Microsoft.Win32; using System.Diagnostics; using System.IO; namespace MSCL { /// ...

  8. STL容器之间的差异和联系

     1.vector  (连续的空间存储,可以使用[]操作符)快速的访问随机的元素,快速的在末尾插入元素,但是在序列中间的插入,删除元素要慢(涉及元素复制移动),而且如果一开始分配的空间不够的话,有一个 ...

  9. [hadoop][会装]zookeeper安装

    1.简介 分布式场景下的各个进程间的协调运作离不开zookeeper, zookeeper已经是大数据领域提供分布式协调服务的事实标准. 本文只介绍zookeeper的安装方法. 2. 节点规划如下: ...

  10. ios IAP 内购验证

    参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...