hdu5785(极角排序求所有锐角钝角个数)
做法很显然,求出所有的锐角和钝角就能求出有多少个锐角三角形了。
我用了愚钝的方法,写了两三个小时。。。
看了下别人简单的代码。学习了下做法。
sort(temp+,temp+cnt+);//排序
For(j,,cnt)//这一步,复制了一遍所有角,然后就能很好的处理在逆时针的情况
{
temp[j+cnt]=temp[j]+*PI;
}
int l=,r=,le=;
For(j,,cnt)
{
while(temp[r]-temp[j]<PI&&r<=*cnt)r++;//找出<180的角
while(temp[l]-temp[j]<0.5*PI&&l<=*cnt)l++;//找出<90度的角
while(temp[le]-temp[j]<=eps&&le<=*cnt)le++;//排除一条直线的情况
ans1=ans1+r-l;
ans2=ans2+l-le;
}
再附上自己拙略的代码:
//
// main.cpp
// hdu5784
//
// Created by New_Life on 16/8/10.
// Copyright © 2016年 chenhuan001. All rights reserved.
// #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define PI acos(-1.0) struct point
{
int x,y;
double shita;
}g[],tg[]; int cmp(point p1,point p2)
{
return p1.shita<p2.shita;
} double operator*(point p1, point p2) // 计算叉乘 p1 × p2
{
return ((long long)p1.x * p2.y - (long long)p2.x * p1.y);
}
double operator&(point p1, point p2) { // 计算点积 p1·p2
return ((long long)p1.x * p2.x + (long long)p1.y * p2.y);
} int dsub(int p1,int p2)
{
return (tg[p1]*tg[p2]<=)&&( (tg[p1]&tg[p2])> );
} int savenum[]; int main(int argc, const char * argv[]) {
int n;
while(cin>>n)
{
for(int i=;i<n;i++)
{
scanf("%d%d",&g[i].x,&g[i].y);
}
long long ans = ;
for(int i=;i<n;i++)
{
int cnt = ;
for(int j=;j<n;j++)
{
if(j==i) continue;
int tx = g[j].x - g[i].x;
int ty = g[j].y - g[i].y;
tg[cnt].x = tx; tg[cnt].y = ty;
tg[cnt++].shita = atan2(ty, tx);
}
if(cnt < ) continue;
sort(tg,tg+cnt,cmp);
memset(savenum,,sizeof(savenum)); int scnt= cnt;
int tcnt = ;
savenum[tcnt++] = ;
for(int j=;j<cnt;j++)
{
if( tg[j]*tg[tcnt-]== && ( (tg[j]&tg[tcnt-])> ) )
{
savenum[tcnt-]++;
}
else
{
tg[tcnt] = tg[j];
savenum[tcnt] = ;
tcnt++;
}
} cnt = tcnt;
for(int j=;j<cnt;j++)
{
ans += savenum[j]*(savenum[j]-);
} if(cnt==) continue;
tcnt = ;
int lf=,rt=; while( dsub(,lf) ){
tcnt += savenum[lf];
lf = (lf-+cnt)%cnt;
if(lf == ) break;
}
lf = (lf+)%cnt;
while( rt!= && dsub(rt,) ) tcnt+=savenum[rt],rt = (rt+)%cnt;
//rt = (rt-1+cnt)%cnt;
ans += savenum[]*(tcnt-savenum[]);
ans -= *savenum[]*(scnt-tcnt); for(int j=;j<cnt;j++)
{
if(j == lf)
{
tcnt -= savenum[lf];
lf = (lf+)%cnt;
}
if(j == rt)
{
tcnt += savenum[j];
rt = (rt+)%cnt;
}
while( !dsub(j,lf) )
{
tcnt -= savenum[lf];
lf= (lf+)%cnt;
//if(lf == j) break;
}
while(rt!=j && dsub(rt,j) ) tcnt+=savenum[rt],rt=(rt+)%cnt;
ans += savenum[j]*(tcnt-savenum[j]);
ans -= *savenum[j]*(scnt-tcnt);
}
}
cout<<ans/<<endl;
}
return ;
}
/*
4
0 0
0 1
1 0
1 1
9
0 0
2 0
0 1
2 1
1 0
1 1
0 2
1 2
2 2
4
0 0
1 1
2 2
3 3
5
0 0
1 1
2 2
-1 0
10000 0
*/
hdu5785(极角排序求所有锐角钝角个数)的更多相关文章
- L3-021 神坛(极角排序求三角形最小面积)
在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...
- poj 1696 极角排序求最长逆时针螺旋线
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4970 Accepted: 3100 Descrip ...
- Wall--POJ1113(极角排序+求凸包)
http://poj.org/problem?id=1113 题目大意:现在要给n个点,让你修一个围墙把这些点围起来,距离最小是l 分析 :现在就是求凸包的周长然后再加上一个圆的周长 #includ ...
- POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)
题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...
- How Many Triangles (极角排序 + 尺取法)
题意:二维平面与有很多个点,然后求构成锐角三角形的个数. 思路:对于每一个三角形我们知道存在至少2个锐角,只要有一个钝角就不行了,所以我们的想法就是枚举所有夹角的状态,然后得知情况,确定用总个数减去- ...
- hdu-5784 How Many Triangles(计算几何+极角排序)
题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- UVaLive 4064 Magnetic Train Tracks (极角排序)
题意:给定 n 个不三点共线的点,然后问你能组成多少锐角或者直角三角形. 析:可以反过来求,求有多少个钝角三角形,然后再用总的减去,直接求肯定会超时,但是可以枚举每个点,以该点为钝角的那个顶点,然后再 ...
- 【极角排序、扫描线】UVa 1606 - Amphiphilic Carbon Molecules(两亲性分子)
Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of ...
- POJ 2280 Amphiphilic Carbon Molecules 极角排序 + 扫描线
从TLE的暴力枚举 到 13313MS的扫描线 再到 1297MS的简化后的扫描线,简直感觉要爽翻啦.然后满怀欣喜的去HDU交了一下,直接又回到了TLE.....泪流满面 虽说HDU的时限是2000 ...
随机推荐
- Bag Problem
Bag Problem Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/131072 K (Java/Others) Total ...
- 制作变形、移位、扭曲等效果:《CSS3 transform》
今天开始我们一起来学习有关于CSS3制作动画的几个属性:变形(transform).转换(transition)和动画(animation)等更高级的CSS3技术.本文主要介绍的是这三个属性之中的第一 ...
- eclipse字体推荐
首先大家可以看看这里面推荐的最佳十款字体,http://www.iteye.com/news/11102-10-great-programming-font 但是经过测试发现,排名第一的字体在ecli ...
- ListView Animation
简单介绍一下4种动画效果方式AnimationSet set = new AnimationSet(false); Animation animation = new AlphaAnimation(0 ...
- xcode下载地址
本帖最后由 tsingjun 于 12/9/20 04:46 PM 编辑 Xcode 4.4.1正式版下载地址 http://kuai.xunlei.com/d/UXZFTWONQLUD XCode ...
- django学习日志之自定义用户扩展
django 为我们提供了强大的用户认证系统,并且提供了基于该系统的User模型,所以,很多时候,我们有必要对自己的user进行业务扩展,得到满足我们自己业务需求的user.借此,写下自己的感悟. u ...
- Listview的闪烁问题
在更新Listview数据时会出现闪烁,主要原因是没有开启双缓冲属性,在C#中可以通过重载Listview的方式开启,代码如下: using System.Windows.Forms; public ...
- 如何选择正确的DevOps工具
坦白的讲:世界上没有哪种工具能够像DevOps这么神奇(或敏捷,或精益).DevOps在开发和运营团队之间建立了完美的合作与沟通,因此与其说这是一种神奇的工具,不如说是一种文化的转变. 然而,团队之间 ...
- Oracle ——————建表、select、视图
--建表 -- 关键字 : create -- 用法 : /* create table table_name ( lie1_name 数据类型 是否为空, lie2_name 数据类型 是否为空, ...
- [SAP ABAP开发技术总结]反射,动态创建内表、结构、变量
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...