做法很显然,求出所有的锐角和钝角就能求出有多少个锐角三角形了。

我用了愚钝的方法,写了两三个小时。。。

看了下别人简单的代码。学习了下做法。

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(极角排序求所有锐角钝角个数)的更多相关文章

  1. L3-021 神坛(极角排序求三角形最小面积)

    在古老的迈瑞城,巍然屹立着 n 块神石.长老们商议,选取 3 块神石围成一个神坛.因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好.特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面 ...

  2. poj 1696 极角排序求最长逆时针螺旋线

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4970   Accepted: 3100 Descrip ...

  3. Wall--POJ1113(极角排序+求凸包)

    http://poj.org/problem?id=1113 题目大意:现在要给n个点,让你修一个围墙把这些点围起来,距离最小是l 分析  :现在就是求凸包的周长然后再加上一个圆的周长 #includ ...

  4. POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)

    题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...

  5. How Many Triangles (极角排序 + 尺取法)

    题意:二维平面与有很多个点,然后求构成锐角三角形的个数. 思路:对于每一个三角形我们知道存在至少2个锐角,只要有一个钝角就不行了,所以我们的想法就是枚举所有夹角的状态,然后得知情况,确定用总个数减去- ...

  6. hdu-5784 How Many Triangles(计算几何+极角排序)

    题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. UVaLive 4064 Magnetic Train Tracks (极角排序)

    题意:给定 n 个不三点共线的点,然后问你能组成多少锐角或者直角三角形. 析:可以反过来求,求有多少个钝角三角形,然后再用总的减去,直接求肯定会超时,但是可以枚举每个点,以该点为钝角的那个顶点,然后再 ...

  8. 【极角排序、扫描线】UVa 1606 - Amphiphilic Carbon Molecules(两亲性分子)

    Shanghai Hypercomputers, the world's largest computer chip manufacturer, has invented a new class of ...

  9. POJ 2280 Amphiphilic Carbon Molecules 极角排序 + 扫描线

    从TLE的暴力枚举 到 13313MS的扫描线  再到 1297MS的简化后的扫描线,简直感觉要爽翻啦.然后满怀欣喜的去HDU交了一下,直接又回到了TLE.....泪流满面 虽说HDU的时限是2000 ...

随机推荐

  1. jquery 实现页面局部刷新ajax做法

    这个方法就多了去了,常见的有以下几种:下面介绍全页面刷新方法:有时候可能会用到 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲 ...

  2. Javascript正则表达式笔记

    一.字符类 将单独的直接字符放进[]内,就组成了字符类.一个字符类和它所包含的任何字符都匹配. 例如:/[abc]/ 与abc三个字母的任意一个匹配. 同时,还可以定义否定字符类.利用^字符.例如:/ ...

  3. 洛谷P1017 进制转换

    洛谷P1017 进制转换 题目描述 我们可以用这样的方式来表示一个十进制数: 将每个阿拉伯数字乘以一个以该数字所处位置的(值减1)为指数,以10为底数的幂之和的形式.例如:123可表示为 \(1*10 ...

  4. Codeforces Round #370 (Div. 2) C

    Description Memory is now interested in the de-evolution of objects, specifically triangles. He star ...

  5. VS2010常用快捷键

    ctrl + K, ctrl + F 自动调整格式(选中内容) F12 转到定义 ctrl + F12 转到声明 ctrl + tab 文档窗口转换(下一个文档窗口) alt + F6 下一个面板窗口 ...

  6. 什么是“鸭子类型(duck typing)”?

    在计算机编程世界里会接触到一个知识点 —— duck typing,叫“鸭子类型”.   它有一个形象的解释: “当看到一只鸟走起来像鸭子.游泳起来像鸭子.叫起来也像鸭子,那么这只鸟就可以被称为鸭子. ...

  7. NET MVC1项目升级到MVC2最简单的方法

    NET MVC1项目升级到MVC2最简单的方法 把MVC1项目升级到MVC2,最简单的做法如下: 新建MVC2项目 新建一个MVC2项目,把原来MVC1的项目文件全部拷贝到新建MVC2项目目录里,依照 ...

  8. CUBRID学习笔记 19 sql语句1

    创建 欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com . 过错 create table tableName (字段名 字段类型 pr ...

  9. 线程入门之优先级priority

    package com.thread; /** * 优先级: * Thread.MAX_PRIORITY:最大优先级 10 * Thread.MIN_PRIORITY:最小优先级 1 * Thread ...

  10. h5上滑刷新(分页)

    $('.dom').append('<div class="loadingwrap" id="loading" style="display:n ...