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. Vuejs - 强大的指令系统

    在 Vuejs 中,指令(Directives)是带有 v- 前缀的特殊属性.指令属性的预期值是 单个 Javascript 表达式(v-for 是个例外).指令的职责是,当表达式改变时,将其产生的连 ...

  2. Maven整体认识——详细介绍

    前言 本文可以帮助你加深对Maven的整体认识,不是一篇基础文章.如果你现在还没有用 Maven 跑过 HelloWorld,那么本文可能不适合你. 一.Maven简介 Maven 官网:https: ...

  3. 【洛谷 P3194】 [HNOI2008]水平可见直线 (单调栈)

    题目链接 把线段以斜率为第一关键字,截距为第二关键字升序排序. 然后维护一个单调栈,保证栈中两两线段的交点的\(x\)坐标单调上升就行了.栈中的线段即为所求. #include <cstdio& ...

  4. Git彻底删除历史提交记录的方法

    有时候我们可能会遇到git提交错误的情况,比如提交了敏感的信息或者提交了错误的版本.这个时候我们想将提交到代码库的记录删除,我们要怎么做呢? 首先,我们需要找到我们需要回滚到的提交点的hash,可以使 ...

  5. javascript中break和continue

    1.break break语句会立即退出循环,强制执行循环后面的语句 var num = 0; for(var i=1;i<10;i++){ if(i%5 == 0){ break; } num ...

  6. mysql执行load_fle返回NULL的解决方法

    mysql 版本: 5.7.18 问题: 在执行mysql 函数load_file时,该函数将加载指定文件的内容,存储至相应字段.如: SELECT LOAD_FILE("D:\aa.txt ...

  7. Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】

    转自:http://blog.csdn.net/droidphone/article/details/7467436 Linux的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得 ...

  8. yml格式

    是什么? yml文件扩展名是YAML的缩写,YAML于2001年出现,是一种数据描述语言,和xml类似 为什么用它? 我们在做javaweb项目的时候最常见的就是.xml配置文件和properitie ...

  9. Kettle使用介绍——Kettle的安装与基本使用

    下面的链接是原文 http://www.cnblogs.com/limengqiang/archive/2013/01/16/KettleApply1.html

  10. 动画基础--基于Core Animation(3)

    参考:https://zsisme.gitbooks.io/ios-/content/ 前面的文章动画基础--基于Core Animation(1),动画基础--基于Core Animation(2) ...