bzoj 4246: 两个人的星座 计算几何
据说是合宿系列最难的一题。。。(反正我一题都不会也没什么感觉)
考虑任意一对符合条件的三角形(i,j),一定可以在三角形i和j中找到两对点,这两点的连线段所在直线将这对三角形分割到两个不同的半平面中。即存在两条公切线。
那么我们就可以枚举这条公切线了,也就是O(N^2)枚举,这样可以暴力O(N^3)得到答案;注意到如果,枚举一个定点,然后将剩下的点按与定点连线段所在直线的斜率(极角)排序,那么就可以O(N)扫一遍得到答案了。那么就是O(N^2)的了。注意到一对三角形被重复算了4遍,最后要除以4。
AC代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define pi acos(-1.0)
#define ll long long
using namespace std;int n,c[2][3],blg[10005];
struct point{ int x,y,c,id; double k; }p[10005];
bool cmp(point x,point y){ return x.k<y.k; }
int main(){scanf("%d",&n); int i,j,k;for (i=1; i<=n; i++) scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].c);for (i=1; i<=n; i++) p[i].id=i;point o; ll tmp,ans=0;for (i=1; i<=n; i++){for (j=1; j<=n; j++) if (p[j].id==i) break;o=p[j]; k=o.c;for (j=1; j<=n; j++){p[j].k=(p[j].id!=i)?atan2(p[j].y-o.y,p[j].x-o.x):1e100;if (p[j].k<=0) p[j].k+=pi;}sort(p+1,p+n+1,cmp);memset(c,0,sizeof(c));for (j=1; j<n; j++)if (p[j].y<o.y || p[j].y==o.y && p[j].x>o.x){c[0][p[j].c]++; blg[j]=0;} else{c[1][p[j].c]++; blg[j]=1;}for (j=1; j<n; j++){c[blg[j]][p[j].c]--; tmp=1;if (k) tmp*=c[0][0]; if (p[j].c) tmp*=c[1][0];if (k^1) tmp*=c[0][1]; if (p[j].c^1) tmp*=c[1][1];if (k^2) tmp*=c[0][2]; if (p[j].c^2) tmp*=c[1][2];ans+=tmp; tmp=1;if (k) tmp*=c[1][0]; if (p[j].c) tmp*=c[0][0];if (k^1) tmp*=c[1][1]; if (p[j].c^1) tmp*=c[0][1];if (k^2) tmp*=c[1][2]; if (p[j].c^2) tmp*=c[0][2];ans+=tmp;blg[j]^=1; c[blg[j]][p[j].c]++;}}printf("%lld\n",ans>>2);return 0;
}
by lych
2016.3.28
bzoj 4246: 两个人的星座 计算几何相关推荐
- [几何] BZOJ 4246 两个人的星座
Po姐说 考虑两个三角形,如果这两个三角形相离,那么一定可以做出两条内公切线,否则做不出来 枚举一个点,以这个点为中心按极角序枚举另一个点,连接这两个点作出一条公切线,那么这两个三角形分别分布在这条线 ...
- [BZOJ4246]两个人的星座(计算几何)
4246: 两个人的星座 Time Limit: 40 Sec Memory Limit: 256 MB Submit: 101 Solved: 55 [Submit][Status][Discu ...
- [计算几何] [BZOJ4246] 两个人的星座
JOI2014最难的一道题? 题目在这里,讲道理感谢Po姐的翻译. 算是补坑了,Po姐来讲课的时候讲的一道题. 原版题解在这里,继续推荐有日文的基础的童鞋食用.日语是个好东西- 最暴力的一种解法就是把 ...
- bzoj4246: 两个人的星座
题目描述: $JOI$ 酱和 $IOI$ 酱是好朋友.某天, $JOI$ 酱与 $IOI$ 酱决定去山上的某个展望台进行天体观测. 从展望台上可以观测到 $N$ 颗星星,编号为 $1...N$ .每颗 ...
- HYSBZ/BZOJ 1007 [HNOI2008] 水平可见直线 - 计算几何
题目描述 分析: 直角坐标系内,有n条直线分布,求:最大值(对于任意x,直线上能取到的max( f(x) ))构成的折线由哪些直线构成. Solution : 把直线按照斜率从小到大排序. 从左到右: ...
- bzoj 1007 : [HNOI2008]水平可见直线 计算几何
题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...
- BZOJ 4066: 简单题
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MB Submit: 2373 Solved: 622 [Submit][Status][Discuss ...
- bzoj 刷题计划~_~
bzoj 2818 两个互质的数的gcd=1,所以他们同时乘一个素数那么他们的gcd=这个素数,所以枚举素数p找n/p以内有多少对互质数,用欧拉函数. bzoj 2809 可并堆,对于每一个子树显然是 ...
- 细思恐极的星座分析(上) ——用大数据和机器学习揭开十二星座的真实面目!
"为什么我的论文总发表不了,是不是我天生就不是做研究的料?"很多同学在写论文中遇到挫折,经常会发出这样的疑问.那么今天我就用星座,真实的数据和"高大上"的机器学 ...
最新文章
- IOS-获取Model(设备型号)、Version(设备版本号)、app(程序版本号)等
- 组织敏捷之路上的七点体会
- python3 llvmlite源码_将Paddle-Lite在树莓派上源码编译及编译python预测库
- 170405、java版MD5工具类
- leetcode 220. 存在重复元素 III(排序)
- PyCharm光标变粗的解决办法
- OpenCV之颜色空间转换(笔记10)
- freeMarker(十二)——模板语言补充知识
- 计算机不觉晓,人工智能知多少
- 【微信小程序模板直接套用】微信小程序制作模板套用平台
- android studio插件 统计代码行数
- oracle 优化方法总结
- Google Sketchup论坛
- Redhat下小企鹅输入法的安装
- python计算三个点构成的三角形的外切圆圆心坐标及半径
- 怎样用matlab做矩阵的LU分解,矩阵LU分解程序实现(Matlab)
- GitModel数学建模 —— 动手学数理统计
- WmiPrvSe.exe 的 cpu 占用
- 大学生恋爱交友软件01(小幸运)——需求调研
- 钉钉小程序上传附件(PDF等非媒体文件)至第三方文件服务器(企业内部应用)