Convex(扫描线降维)

时间:2021-07-13 02:54:38

Convex

Time Limit: 10000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1838    Accepted Submission(s): 552

Problem Description
Your task is very simple. You will get the coordinates of n points in a plane. It is guaranteed that there are no three points on a straight line. You can choose any four points from these points to construct a quadrangle. Now, please tell me how many convex quadrangles you can construct.
 
Input
The first line of input contain an integer z (z ≤ 20), indicating the number of test cases.
For each test case, the first line contain an integer n (4 ≤ n ≤ 700), indicating the number of points. Each of the next n lines contains two integers x and y (-1000000 ≤ x, y ≤ 1000000), indicating the coordinate of corresponding point.
 
Output
For each test case, just output a single integer, the number of convex quadrangles you can construct.
 
Sample Input
2
4
0 0
0 1
1 0
1 1
4
0 0
1 0
0 1
-1 -1
 
Sample Output
1
0
 
题意:给出700个点,求可以构成多少个凸四边形,如果暴力的话肯定会超时
  那么可以逆向思维,C4个四边形减去凹四边形即可
  只要一个三角形中有一个点就是一个凹四边形,但是暴力找三角形照样会超时
  那么久找一个点在多少个三角形中和最后统计的每个三角形中的点数的总数是一样的
  要想找一个点在多少个三角形中就可以找一个点没在多少个三角形中然后C3n个总共的三角形减去这个值即可
  用扫描线法找到其不再多少个三角形的时候,只要枚举每个点,以这个点为中心点的话,和其他每个点连线,找这个线的一侧的点数j , 其上面任选两个点即可构成一个不包含它的三角形
所以就可以C2j 个三角形不包含它,所以先以中心点,将其他点按犄角排序,然后开始逆时针扫描另一侧不用扫描因为在线在转的时候回有扫到下侧的点的,要是考虑两侧的话所有的三角形会被算两遍,这样 枚举中心点是n 的复杂度,每次排序是logn 统计数目又是找点又是n 的,所以最后的复杂度就是n*(logn+n) 这样就不会超时了,起到了降维的作用
  下面是代码:
 #include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std; #define eps 1e-8
#define pi acos(-1.0)
#define N 750 int n; struct point
{
double x, y;
point(){}
point(double _x, double _y ):x(_x), y(_y){}
}; point P[N];
double ang[*N];
int main()
{
//printf("%d", 700*699*698/6);
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = ; i < n; i++)
scanf("%lf %lf", &P[i].x, &P[i].y); long long ans = (long long)n*(n-)*(n-)*(n-)/;//C(n,4)
for(int i = ; i < n; i++)
{
long long cnt = (long long)(n-)*(n-)*(n-)/;//cnt记录包含i的三角形个数 int c = ;
for(int j = ; j < n; j++)
{
if(i == j) continue;
ang[c++] = atan2(P[j].y-P[i].y, P[j].x - P[i].x);
} sort(ang, ang+c);
for(int j = c; j < *c; j++)
{
ang[j] = ang[j-c] + *pi;
// printf("a-- %lf\n", ang[j-c] * 180.0 /pi);
}
// puts(""); int k = ; //puts("haha");while(t < 1000000000) t++;
for(int j = ; j < c; j++)//不包含i的三角形
{
while(ang[k] - ang[j] < pi) k++;
int d = k-j-;
// printf("d = %d\n", d);
if(d > ) cnt -= d*(d-)/;
} ans -= cnt;
}
printf("%I64d\n",ans);
}
return ;
}

Convex(扫描线降维)的更多相关文章

  1. 【题解】Atcoder ARC&num;76 F-Exhausted&quest;

    第一次用霍尔定理做题..简单的来说,就是判断一张二分图上是否存在完美匹配,只需要证明对于 \(a\) 集合中的任意 \(k\) 个点来说,都与 \(b\) 集合中的 \(k\) 个点有边相连.如果不满 ...

  2. Luogu 3242 &lbrack;HNOI2015&rsqb;接水果

    BZOJ4009 权限题 真的不想再写一遍了 大佬blog 假设有果实$(x, y)$,询问$(a, b)$,用$st_i$表示$i$的$dfs$序,用$ed_i$表示所有$i$的子树搜完的$dfs$ ...

  3. 压缩感知与稀疏模型&mdash&semi;&mdash&semi;Convex Methods for Sparse Signal Recovery

    第三节课的内容.这节课上课到半截困了睡着了,看着大家都很积极请教认真听讲,感觉很惭愧.周末不能熬太晚.这个博客就记录一下醒着时候听到的内容. Motivation 目前的时代需要处理的数据量维度可能很 ...

  4. 奇异值分解&lpar;SVD&rpar;原理与在降维中的应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐系统,以及自然语言处理等领域.是 ...

  5. 用scikit-learn进行LDA降维

    在线性判别分析LDA原理总结中,我们对LDA降维的原理做了总结,这里我们就对scikit-learn中LDA的降维使用做一个总结. 1. 对scikit-learn中LDA类概述 在scikit-le ...

  6. scikit-learn一般实例之四&colon;使用管道和GridSearchCV选择降维

    本例构建一个管道来进行降维和预测的工作:先降维,接着通过支持向量分类器进行预测.本例将演示与在网格搜索过程进行单变量特征选择相比,怎样使用GrideSearchCV和管道来优化单一的CV跑无监督的PC ...

  7. &lbrack;LeetCode&rsqb; Convex Polygon 凸多边形

    Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...

  8. 机器学习基础与实践(三)----数据降维之PCA

    写在前面:本来这篇应该是上周四更新,但是上周四写了一篇深度学习的反向传播法的过程,就推迟更新了.本来想参考PRML来写,但是发现里面涉及到比较多的数学知识,写出来可能不好理解,我决定还是用最通俗的方法 ...

  9. 数据降维技术(1)—PCA的数据原理

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...

随机推荐

  1. JavaScript中的slice&comma;splice&comma;substr&comma;substring&comma;split的区别

    万恶的输入法,在sublime中会显示出繁体字,各位看官见谅. 1.slice()方法:该方法在数组和string对象中都拥有. var a = [1,2,3,4,5,6]; var s = 'thi ...

  2. Ubuntu下SVN配置

    今天上午写了一个脚本,然后想起来现在写的R脚本,常常在分析过程中就直接改掉了.隐隐还是觉得存在隐患,想着svn部署应该不会太难,于是就直接动手干了. 弄了一上午的时间,感觉还是花了点时间. 这里有篇b ...

  3. poj3984迷宫问题 广搜&plus;最短路径&plus;模拟队列

    转自:http://blog.csdn.net/no_retreats/article/details/8146585   定义一个二维数组: int maze[5][5] = { 0, 1, 0, ...

  4. Kafka消费时报错:Producer connection to xxx&colon;9092 unsuccessful

    使用kafka消费数据时报Producer错误,具体错误如下: kafka.producer.SyncProducer:103 Producer connection to xxx:9092 unsu ...

  5. 大道至简第一章Java伪代码

    1.编程的精义//愚公移山public class Yugong{public static void main(String[]args){        while(山没平){           ...

  6. &period;Net拾忆:HttpWebRequest&sol;WebClient两种方式模拟Post

    一.代码 1.HttpWebRequest public static string DoPost( string target, string content ) { try { string pa ...

  7. 树莓派获取ip地址发送到邮箱

    公网 ip.sh curl http://members.3322.org/dyndns/getip >>/email/ip.log python /email/mail.py ##### ...

  8. 难部署的taiga,式微的circus——趋势从进程管理到容器管理,简单才是美

    一直需要一个项目管理系统,一直没时间弄. taiga是github上搜project management star最多的项目,又是基于django用python写的后端,所以就用它: 但是,集中精力 ...

  9. Sql-Server触发器,根据条件匹配另一个表中的字段

    USE [CDM] GO /****** Object: Trigger [dbo].[UpdateAkisFlight] Script Date: 2018/6/14 16:43:29 ****** ...

  10. HDU 1358

    http://acm.hdu.edu.cn/showproblem.php?pid=1358 求某个前缀的周期,用Next求循环节的题目 #include <iostream> #incl ...