博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ4246]两个人的星座(计算几何)
阅读量:5086 次
发布时间:2019-06-13

本文共 2644 字,大约阅读时间需要 8 分钟。

4246: 两个人的星座

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

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

[ ][ ][ ]

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

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

1 #include
2 #include
3 #include
4 #include
5 #define rep(i,l,r) for (int i=l; i<=r; i++) 6 #define ll long long 7 using namespace std; 8 9 const int N=3030;10 const double Pi=acos(-1.);11 int n,s,c[2][3],bl[N];12 struct P{13 int x,y,c,id; double k;14 bool operator < ( const P &b ) const { return k < b.k; }15 }p[N];16 17 int main(){18 scanf("%d",&n);19 rep(i,1,n) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].c),p[i].id=i;20 P o; ll tmp,ans=0;21 rep(i,1,n){22 rep(j,1,n) if (p[j].id==i) { s=j; break; }23 o=p[s]; int k=o.c;24 rep(j,1,n){25 p[j].k=(p[j].id!=i) ? atan2(p[j].y-o.y,p[j].x-o.x) : 1e9;26 if (p[j].k<=0) p[j].k+=Pi;27 }28 sort(p+1,p+n+1); memset(c,0,sizeof(c));29 rep(j,1,n-1)30 if (p[j].y
o.x))31 c[bl[j]=0][p[j].c]++; else c[bl[j]=1][p[j].c]++;32 rep(j,1,n-1){33 c[bl[j]][p[j].c]--; tmp=1;34 if (k) tmp*=c[0][0]; if (p[j].c) tmp*=c[1][0];35 if (k^1) tmp*=c[0][1]; if (p[j].c^1) tmp*=c[1][1];36 if (k^2) tmp*=c[0][2]; if (p[j].c^2) tmp*=c[1][2];37 ans+=tmp; tmp=1;38 if (k) tmp*=c[1][0]; if (p[j].c) tmp*=c[0][0];39 if (k^1) tmp*=c[1][1]; if (p[j].c^1) tmp*=c[0][1];40 if (k^2) tmp*=c[1][2]; if (p[j].c^2) tmp*=c[0][2];41 ans+=tmp; c[bl[j]^=1][p[j].c]++;42 }43 }44 printf("%lld\n",ans>>2);45 return 0;46 }

 

转载于:https://www.cnblogs.com/HocRiser/p/8811268.html

你可能感兴趣的文章
使用Gitblit 在windows 上部署你的Git Server
查看>>
217. Contains Duplicate
查看>>
vue2.0 关于Vue实例的生命周期
查看>>
jenkins 更换主数据目录
查看>>
Silverlight中恼人的g.i.cs错误
查看>>
SQLite 数据库增删改查
查看>>
<s:iterator>的status
查看>>
C++入门--1.0输入输出
查看>>
让搭建在Github Pages上的Hexo博客可以被Google搜索到
查看>>
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段...
查看>>
在WPF控件上添加Windows窗口式调整大小行为
查看>>
背水一战 Windows 10 (36) - 控件(弹出类): ToolTip, Popup, PopupMenu
查看>>
打开3389
查看>>
React学习记录
查看>>
nginx常见内部参数,错误总结
查看>>
对象与类
查看>>
《奸的好人2》财色战场----笔记
查看>>
BZOJ 1834网络扩容题解
查看>>
bzoj1878
查看>>
【Vegas原创】Mysql绿色版安装方法
查看>>