据说是合宿系列最难的一题。。。(反正我一题都不会也没什么感觉)

考虑任意一对符合条件的三角形(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: 两个人的星座 计算几何相关推荐

  1. [几何] BZOJ 4246 两个人的星座

    Po姐说 考虑两个三角形,如果这两个三角形相离,那么一定可以做出两条内公切线,否则做不出来 枚举一个点,以这个点为中心按极角序枚举另一个点,连接这两个点作出一条公切线,那么这两个三角形分别分布在这条线 ...

  2. [BZOJ4246]两个人的星座(计算几何)

    4246: 两个人的星座 Time Limit: 40 Sec  Memory Limit: 256 MB Submit: 101  Solved: 55 [Submit][Status][Discu ...

  3. [计算几何] [BZOJ4246] 两个人的星座

    JOI2014最难的一道题? 题目在这里,讲道理感谢Po姐的翻译. 算是补坑了,Po姐来讲课的时候讲的一道题. 原版题解在这里,继续推荐有日文的基础的童鞋食用.日语是个好东西- 最暴力的一种解法就是把 ...

  4. bzoj4246: 两个人的星座

    题目描述: $JOI$ 酱和 $IOI$ 酱是好朋友.某天, $JOI$ 酱与 $IOI$ 酱决定去山上的某个展望台进行天体观测. 从展望台上可以观测到 $N$ 颗星星,编号为 $1...N$ .每颗 ...

  5. HYSBZ/BZOJ 1007 [HNOI2008] 水平可见直线 - 计算几何

    题目描述 分析: 直角坐标系内,有n条直线分布,求:最大值(对于任意x,直线上能取到的max( f(x) ))构成的折线由哪些直线构成. Solution : 把直线按照斜率从小到大排序. 从左到右: ...

  6. bzoj 1007 : [HNOI2008]水平可见直线 计算几何

    题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...

  7. BZOJ 4066: 简单题

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MB Submit: 2373  Solved: 622 [Submit][Status][Discuss ...

  8. bzoj 刷题计划~_~

    bzoj 2818 两个互质的数的gcd=1,所以他们同时乘一个素数那么他们的gcd=这个素数,所以枚举素数p找n/p以内有多少对互质数,用欧拉函数. bzoj 2809 可并堆,对于每一个子树显然是 ...

  9. 细思恐极的星座分析(上) ——用大数据和机器学习揭开十二星座的真实面目!

    "为什么我的论文总发表不了,是不是我天生就不是做研究的料?"很多同学在写论文中遇到挫折,经常会发出这样的疑问.那么今天我就用星座,真实的数据和"高大上"的机器学 ...

最新文章

  1. IOS-获取Model(设备型号)、Version(设备版本号)、app(程序版本号)等
  2. 组织敏捷之路上的七点体会
  3. python3 llvmlite源码_将Paddle-Lite在树莓派上源码编译及编译python预测库
  4. 170405、java版MD5工具类
  5. leetcode 220. 存在重复元素 III(排序)
  6. PyCharm光标变粗的解决办法
  7. OpenCV之颜色空间转换(笔记10)
  8. freeMarker(十二)——模板语言补充知识
  9. 计算机不觉晓,人工智能知多少
  10. 【微信小程序模板直接套用】微信小程序制作模板套用平台
  11. android studio插件 统计代码行数
  12. oracle 优化方法总结
  13. Google Sketchup论坛
  14. Redhat下小企鹅输入法的安装
  15. python计算三个点构成的三角形的外切圆圆心坐标及半径
  16. 怎样用matlab做矩阵的LU分解,矩阵LU分解程序实现(Matlab)
  17. GitModel数学建模 —— 动手学数理统计
  18. WmiPrvSe.exe 的 cpu 占用
  19. 大学生恋爱交友软件01(小幸运)——需求调研
  20. 钉钉小程序上传附件(PDF等非媒体文件)至第三方文件服务器(企业内部应用)

热门文章

  1. 2021-10-19 SAP 创建会计凭证 BTE替代利润中心
  2. react 日期怎么格式化_react日期格式化组件
  3. Java游戏项目之坦克大战
  4. Google 人机验证(reCaptcha)无法显示解决方案
  5. Python:求列表的最大数以及下标
  6. 婴幼儿体重在线计算机,【婴儿体重计算器标准_婴儿体重计算器标准专题】- 天鹅到家...
  7. 我们都有过一段很美好的时光
  8. 2014年优秀动画片推荐:马来西亚动画片《Ribbit》
  9. 记一次服务不能正常使用 tmp文件爆满
  10. VScode 直接运行ts文件