[BZOJ4246]两个人的星座(计算几何)
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 2Sample Output
4HINT
样例中,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
相离则显然能被公切线分割,枚举+极交排序即可。
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]两个人的星座(计算几何)的更多相关文章
- LOJ2882 JOISC2014 两个人的星座 计算几何
传送门 一件值得注意的事情是:平面上两个不相交的三角形一定会存在两条公切线 那么我们可以枚举三角形的公切线,计算有多少个三角形的公切线之一为该线,所有的答案除以2就是我们要求的答案. 考虑如何去计算有 ...
- LOJ#2882. 「JOISC 2014 Day4」两个人的星座(计算几何)
题面 传送门 题解 我们发现如果两个三角形相离,那么这两个三角形一定存在两条公切线 那么我们可以\(O(n^2)\)枚举其中一条公切线,然后可以暴力\(O(n^3)\)计算 怎么优化呢?我们可以枚举一 ...
- 「JOISC 2014 Day4」两个人的星座
首先突破口肯定在三角形不交,考虑寻找一些性质. 引理一:两个三角形不交当且仅当存在一个三角形的一条边所在直线将两个三角形分为异侧 证明可以参考:三角形相离充要条件,大致思路是取两个三角形重心连线,将其 ...
- 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题) ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 杭电ACM分类
杭电ACM分类: 1001 整数求和 水题1002 C语言实验题——两个数比较 水题1003 1.2.3.4.5... 简单题1004 渊子赛马 排序+贪心的方法归并1005 Hero In Maze ...
- 转载:hdu 题目分类 (侵删)
转载:from http://blog.csdn.net/qq_28236309/article/details/47818349 基础题:1000.1001.1004.1005.1008.1012. ...
- 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,记 ...
- 巩固复习(Hany驿站原创)_python的礼物
Python编程语言简介 https://www.cnblogs.com/hany-postq473111315/p/12256134.html Python环境搭建及中文编码 https://www ...
随机推荐
- this可以通过call改变的测试
- ubuntu下调整cpu频率
环境:ubuntu15.10 查看内核支持的cpu策略 cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 比如我 ...
- 动态替换Linux核心函数的原理和实现
转载:https://www.ibm.com/developerworks/cn/linux/l-knldebug/ 动态替换Linux核心函数的原理和实现 在调试Linux核心模块时,有时需要能够实 ...
- delphi2006语言新特性:Record类型高级用法
delphi语言在传统的Records类型的基础上增加了许多像类一样的高级功能,如:Records可以有属性和方法(包括构造constructors),类属性,类方法,类静态字段和内嵌类型.下面这个示 ...
- [New learn]@class和#import的区别使用
1.简介 我们在查看代码的时候经常会发现有些地方使用@class而有些地方使用#import,他们到底有什么区别呢, 本文意图去归纳和总结这两种类引用的是的处理方法和规则. 2.分析 此小节会通过一些 ...
- zookeeper安装和搭建集群方式(window)
1. 概述 ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护.名字服务.分布式同步.组服务等.ZooKeeper的目标就是封装好复杂 ...
- css设置div等标签背景半透明
三种方式: 1. background-color: transparent; 直接设置背景为透明 2.这种是子元素也会跟着变成半透明 /* 背景半透明,1为不透明 */ opacity: 0.5; ...
- Python 面向对象的三大特性
面向对象的三大特性:继承,封装,多态 什么时候用封装: 同一种功能的时候, 譬如:把一部分数据或方法,封装到同一个类的中 PS:在构造方法中,原始数据中....
- 数据结构与算法之--高级排序:shell排序和快速排序
高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...
- JAVA 语言类的特性(成员、重载、构造方法、静态成员)
一.类的私有成员和公有成员 1.私有成员 修饰符private 如果在类的声明前加上修饰符private,则无法从该类的外部访问到该类的内部成员,而只能被该类自身访问和修改,而不嗯那个被其他类, ...

.jpg)
