[COCI2007]PRAVOKUTNI
题目大意:
在一个平面上,有\(N\)个点,求这些点构成的直角三角形个数。
解题思路:
枚举直角顶点,对于每个点,将这个点当做原点,对其他点按极角排序,然后双指针扫一遍,判断弧度差即可。
C++ Code:
#include<bits/stdc++.h>
#define eps 1e-15
typedef long long LoveLive;
struct point{
LoveLive x,y;double deg;
inline bool operator <(const point&rhs)const{return deg<rhs.deg;}
}a[1501],b[1501];
inline int readint(){
int c=getchar(),d=0,f=0;
for(;!isdigit(c);c=getchar())f=c=='-';
for(;isdigit(c);c=getchar())d=(d<<3)+(d<<1)+(c^'0');
return f?-d:d;
}
int n;unsigned ans=0;
int main(){
n=readint();
for(int i=1;i<=n;++i)a[i].x=readint(),a[i].y=readint();
for(int i=1;i<=n;++i){
memcpy(b,a,sizeof a);
std::swap(b[i],b[1]);
for(int j=2;j<=n;++j)
b[j].deg=atan2(b[j].y-b[1].y,b[j].x-b[1].x);
std::sort(b+2,b+n+1);
int p1=2,p2=3,n1,n2;
for(;p1<=n;++p1){
n1=n2=1;
while((p2>=p1&&b[p2].deg-b[p1].deg<M_PI_2-eps)||(p2<p1&&b[p1].deg-b[p2].deg>M_PI_2*3+eps)){
++p2;
if(p2>n)p2=2;
if(p2==p1)break;
}
if(p1==p2)break;
if((p2>=p1&&b[p2].deg-b[p1].deg>M_PI_2+eps)||(p2<p1&&b[p1].deg-b[p2].deg<M_PI_2*3-eps))continue;
while(p1<n&&fabs(b[p1].deg-b[p1+1].deg)<eps)++p1,++n1;
while(p2<n&&fabs(b[p2].deg-b[p2+1].deg)<eps)++p2,++n2;
ans+=n1*n2;
}
}
printf("%u\n",ans);
return 0;
}
[COCI2007]PRAVOKUTNI的更多相关文章
- 『追捕盗贼 Tarjan算法』
追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...
随机推荐
- 【UOJ139】【UER #4】被删除的黑白树
题意: 很久很久以前,有一棵树加入了 UOJ 群. 这天,在它讨论“一棵树应该怎么旋转”的时候一不小心被删除了,变成了被删除的树. 突然间,它突然发现它失去了颜色,变成了一棵纯白的树.这让它感觉很焦躁 ...
- C语言求大数的阶乘
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,该如何计算? 当一个数很大时,利用平常的方法是求不出来它的阶乘的,因为数据超出了范围.因此我们要用数组来求一个大数的阶乘,用数组的每位表示结果的 ...
- 理解 Javascript 执行上下文和执行栈
如果你是一名 JavaScript 开发者,或者想要成为一名 JavaScript 开发者,那么你必须知道 JavaScript 程序内部的执行机制.理解执行上下文和执行栈同样有助于理解其他的 Jav ...
- SpringBoot-CommandLineRunner实现预操作
前提:在使用SpringBoot构建项目时,我们通常需要做一些预先操作(类似开机自启动).而SpringBoot正好提供了一个简单的方式来实现–CommandLineRunner. CommandLi ...
- js 文档加载完成之后执行 备用
//文档加载完成之后执行 (function(){ var _globeCallback; window.$$ = function(callback){ _globeCallback = callb ...
- [Design]Adobe CS6 2%错误问题
错误描述:FATAL: Payload '{3F023875-4A52-4605-9DB6-A88D4A813E8D} Camera Profiles Installer 6.0.98.0' info ...
- 根据BDUSS获取用户ID信息
代码在 /data/svndir/business/workroot2/app/ecom/ubec/getuser
- 分享:Android系统的经常使用权限整理
1.ACCES_NETWORK_STATE 同意应用程序获取网络状态信息的权限 2.ACCESS_WIFI_STATE 同意应用程序获取Wi-Fi网络状态的权限 3.BAT ...
- BroadcastReceiver类
java.lang.Object ↳ android.content.BroadcastReceiver 已知直接子类 AppWidgetProvider DeviceAdminReceiver ...
- 【POJ 1704】 Georgia and Bob
[题目链接] http://poj.org/problem?id=1704 [算法] 阶梯博弈 [代码] #include <algorithm> #include <bitset& ...