Po姐说

考虑两个三角形,如果这两个三角形相离,那么一定可以做出两条内公切线,否则做不出来

枚举一个点,以这个点为中心按极角序枚举另一个点,连接这两个点作出一条公切线,那么这两个三角形分别分布在这条线的两端,统计出两侧每种颜色的点之后乘法原理即可

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#define cl(x) memset(x,0,sizeof(x))
#define PI acos(-1.0)
using namespace std;
typedef long long ll;
typedef pair<double,int> abcd;inline char nc(){static char buf[100000],*p1=buf,*p2=buf;if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; }return *p1++;
}inline void read(int &x){char c=nc(),b=1;for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1;for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;
}const int N=3005;struct Point{int x,y; double tan;Point(int x=0,int y=0):x(x),y(y) { }void read(){::read(x); ::read(y);}friend Point operator - (const Point &A,const Point &B){return Point(A.x-B.x,A.y-B.y);}double Tan(){double ret=atan2(y,x);return ret<=0?ret+=PI:ret;}bool operator < (const Point &B) const{return tan<B.tan;}
};int n,pnt; ll ans;
Point now;
abcd K[N];
int vst[N],cnt[5][5];
pair<Point,int> points[N],P[N],tmp[N]; inline ll calc(int x,int c){if (x==0)return (ll)cnt[c][1]*cnt[c][2];else if (x==1)return (ll)cnt[c][0]*cnt[c][2];elsereturn (ll)cnt[c][0]*cnt[c][1];
}inline void Solve(int ii)
{cl(cnt); pnt=0; now=points[ii].first;for (int i=1;i<=n;i++) if (i!=ii) P[++pnt]=points[i];for (int i=1;i<=pnt;i++) P[i].first.tan=(P[i].first-now).Tan();sort(P+1,P+pnt+1);for (int i=1;i<=pnt;i++)if (P[i].first.y<now.y || (P[i].first.y==now.y && P[i].first.x>now.x))cnt[vst[i]=0][P[i].second]++;elsecnt[vst[i]=1][P[i].second]++;for (int i=1;i<=pnt;i++){cnt[vst[i]][P[i].second]--;ans+=calc(points[ii].second,0)*calc(P[i].second,1);ans+=calc(points[ii].second,1)*calc(P[i].second,0);cnt[vst[i]^=1][P[i].second]++;}
}int main()
{freopen("t.in","r",stdin);freopen("t.out","w",stdout);read(n);for (int i=1;i<=n;i++)points[i].first.read(),read(points[i].second);for (int i=1;i<=n;i++)Solve(i);printf("%lld\n",ans/4);return 0;
}

[几何] BZOJ 4246 两个人的星座相关推荐

  1. bzoj 4246: 两个人的星座 计算几何

    据说是合宿系列最难的一题...(反正我一题都不会也没什么感觉) 考虑任意一对符合条件的三角形(i,j),一定可以在三角形i和j中找到两对点,这两点的连线段所在直线将这对三角形分割到两个不同的半平面中. ...

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

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

  3. 几何画板表现两集合的差集的教程

    在学习集合运算中,还可以用图示法来演示两集合的运算,在前面的教程中学习了用图示法演示两集合的交集,本节来学习用图示法演示两集合的差集,学习用几何画板表现两集合的差集课件制作技巧. 几何画板制作的表现两 ...

  4. bzoj4246: 两个人的星座

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

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

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

  6. [几何] BZOJ 2710 [Violet 1]追风者 POJ 3924 Tornado

    好神的几何题 把一个点不动作为参照物 然后就变成了只有一个点在动 画出来就是这样 然后就是求 一个点到两组平行线段的距离最小值 #include<cstdio> #include<c ...

  7. 游戏开发中常用的几何之,两个线段是否相交

    游戏中判断两个线段是否相交的重要依据是根据向量的叉乘判断,所以不熟悉叉乘的意义的可以去看看叉乘的定义和几何意义 相交又分为两种情况,平行相交和非平行相交: 1:先说说平行相交,如果两个向量平行必然满足 ...

  8. 线段交(几何问题判断两个线段是否有交点)

    题目描述 给定N个线段.求有交点的线段对数. 保证没有两条线段共线 输入 一行一个整数N,表示线段的个数 第2~N+1行,每行四个实数,x1,y1,x2,y2,表示线段的两个端点(x1,y1)和(x2 ...

  9. 数字图像处理:第六章 几何运算

    第六章 几何运算 目录 引言 灰度级插值 空间变换 3.1 仿射变换 3.2 透视变换 几何校正 图象卷绕(Image Warping) 图象变形(Image Morphing) 作业 1.引言 几何 ...

最新文章

  1. 程序员求职成功路(2) - 第3章 数据结构与算法
  2. Tomcat学习总结(6)——Tomca常用配置详解
  3. leetcode算法题--树的子结构
  4. 正态随机分布 C++实现
  5. python创建一个空列表alist_【Python 1-7】Python手把手教程之——详解列表List
  6. 计算机技术是双证,计算机技术在职研究生单证可以转双证吗
  7. 【译】 WebSocket 协议第六章——发送与接收消息(Sending and Receiving Data)
  8. TensorFlow学习笔记(二十五)CNN的9大模型
  9. Linux shell编程学习笔记-----第十六章
  10. [Python]爬虫v0.1
  11. 离线安装Python包的三种方法
  12. 解决最新版搜狗输入法的软键盘快捷键Ctrl + Shift + K和Typora的热键冲突问题
  13. TFT液晶屏显示中英文
  14. 修改服务器bond网口mode4,双25GE网卡做bond4测试,其中一个网口没有流量一个网口可以打满的问题分享★★★...
  15. js获取内网/局域网ip地址,操作系统,浏览器版本等信息
  16. windows 11 访问带SMB的文件服务器(小米路由器)
  17. Spring 的自动装配
  18. js 获取距离某个时间过去了多少年,天,月,等
  19. 物联网行业网络解决方案_提供RFID物联网解决方案,东识科技将亮相IOTE 2019苏州物联网展...
  20. 安捷伦or是德信号源+频谱仪操作:从程控到自动测试(二)增益计算的程控实现

热门文章

  1. 基于ambarella安霸H.264编解码芯片的视频采集压缩系统
  2. VScode 直接运行ts文件
  3. python 图像分割_Python中的图像分割(第2部分)
  4. oracle中重做日志损坏,重做日志文件损坏的恢复笔记
  5. 实现 RadioButtonList 单选按钮组设置及横向布局
  6. java 图片加水印不失真_java实现图片加水印效果
  7. python调用R语言
  8. 【GoCN酷Go推荐】ip2location 解析 IP 地址库
  9. EMW3080 STC15轻松实现设备上云3(阿里云物联网平台、智能生活开放平台)
  10. 新计算机是飞行模式怎么开,win10自己打开飞行模式,怎么处理