https://www.bnuoj.com/v3/contest_show.php?cid=9147#problem/E

【题意】

给定n个点的坐标,可以选择其中的四个点构造凸四边形,问最多能构造多少个凸四边形?

【思路】

凸四边形的个数等于C(n,4)-凹四边形的个数。

凹四边形的特点是有一个顶点被另外三个顶点围成的三角形包了起来。

所以现在的问题就是找凹四边形。

我们可以枚举每个点,作为被三角形包围的中心点o。怎么找这样包围中心点的三角形?

这样的三角形一定是在存在一条经过中心点的直线,三角形的三个顶点在直线的同一侧。

那么枚举三角形的一个顶点x,另两个顶点一定在o和x的连线ox的上半平面内。而且这样做类似与尺取,只需O(n)的复杂度。

最后注意的一点是:
printf("%I64d\n",-3LL*n*(n-1)*(n-2)*(n-3)/24+cnt);

printf("%I64d\n",n*(n-1)*(n-2)*(n-3)/24LL-(n*(n-1)*(n-2)*(n-3)/6LL-cnt));

的区别。

前者在前面成了3LL,所以计算连乘的时候是把int转化为ll,不会爆

后者n*(n-1)*(n-2)*(n-3)在计算的过程中已经爆了。

解决办法有两种:
在前面乘以1LL;n变成ll

【Accelerate】

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm> using namespace std;
typedef long long ll;
const int maxn=;
int n;
ll xx[maxn];
ll yy[maxn];
int cur;
double dis(ll x1,ll y1,ll x2,ll y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
struct Point
{
ll x;
ll y;
double dis;
double alf;
Point(){}
Point(ll _x,ll _y):x(_x),y(_y){}
Point operator -(const Point &t) const
{
return Point(x-t.x,y-t.y);
}
ll operator ^(const Point &t)const
{
return (x*t.y)-(y*t.x);
}
double alfa()
{
if(y>yy[cur])return acos((x-xx[cur])/dis);
return -acos((x-xx[cur])/dis);
}
}p[maxn]; bool cmp(Point a,Point b)
{
if(b.x==xx[cur]&&b.y==yy[cur])
{
return true;
}
if(a.x==xx[cur]&&a.y==yy[cur])
{
return false;
}
return a.alf<b.alf;
} int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
cin>>xx[i]>>yy[i];
p[i]=Point(xx[i],yy[i]);
}
ll cnt=;
for(cur=;cur<n;cur++)
{ int l=;
Point o(xx[cur],yy[cur]);
for(int i=;i<n;i++){p[i].dis=dis(p[i].x,p[i].y,xx[cur],yy[cur]);p[i].alf=p[i].alfa();}
sort(p,p+n,cmp);
for(int i=;i<n-;i++)
{
while(((p[i]-o)^(p[l]-o))>)
{
l=(l+)%(n-);
}
int len=(l-i-+n-)%(n-);
cnt+=len*(len-)/;
}
}
// ll ans=n*(n-1)*(n-2)*(n-3)/24LL-(n*(n-1)*(n-2)*(n-3)/6LL-cnt);//注意,这样会爆
// printf("%I64d\n",-3LL*n*(n-1)*(n-2)*(n-3)/24+cnt);//前面乘以3LL,不会爆
printf("%I64d\n",1LL*n*(n-)*(n-)*(n-)/24LL-(1LL*n*(n-)*(n-)*(n-)/6LL-cnt));
}
return ;
}

【知识点】

判断是不是在一个半平面内用到了叉积的性质:

叉积的一个非常重要的性质是通过它的符号判断两向量相互之间的顺逆时针关系:设向量P=(x1,y1),Q=(x2,y2)
如果P*Q>0则P在Q的顺时针方向;
如果P*Q=0则P与Q共线,可能同向,与可能反向;
如果P*Q<0则P在Q的逆时针方向。

【计算几何+极角排序+爆ll】E. Convex的更多相关文章

  1. bzoj 5099 [POI2018]Pionek 计算几何 极角排序

    [POI2018]Pionek Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 269  Solved: 80[Submit][Status][Disc ...

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

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

  3. hrbustoj 1305:多边形(计算几何,极角排序练习)

    多边形 Time Limit: 1000 MS     Memory Limit: 65536 K Total Submit: 113(42 users)   Total Accepted: 51(3 ...

  4. poj 1696:Space Ant(计算几何,凸包变种,极角排序)

    Space Ant Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2876   Accepted: 1839 Descrip ...

  5. Gym 101986D Making Perimeter of the Convex Hull Shortest(凸包+极角排序)

    首先肯定是构造一个完整的凸包包括所有的点,那么要使得刚好有两个点在外面,满足这个条件的只有三种情况. 1.两个在凸包上但是不连续的两个点. 2.两个在凸包上但是连续的两个点. 3.一个在凸包上,还有一 ...

  6. 【计算几何】【极角排序】【二分】Petrozavodsk Summer Training Camp 2016 Day 6: Warsaw U Contest, XVI Open Cup Onsite, Sunday, August 28, 2016 Problem J. Triangles

    平面上给你n(不超过2000)个点,问你能构成多少个面积在[A,B]之间的Rt三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...

  7. 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival

    平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...

  8. LightOJ 1285 - Drawing Simple Polygon (几何,极角排序)

    1285 - Drawing Simple Polygon   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...

  9. HDU 5738 Eureka(极角排序)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5738 [题目大意] 给出平面中一些点,在同一直线的点可以划分为一个集合,问可以组成多少包含元素不少 ...

随机推荐

  1. 操作JavaScript的Alert弹框

    @Testpublic void testHandleAlert(){ WebElement button =driver.findElement(By.xpath("input" ...

  2. .net 发送邮件验证码

    using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Net.Ma ...

  3. poj3040 Allowance

    思路: 贪心. 看了题解说是 先把面值从大到小排序然后从头往尾扫,只要不超额,能取多少去多少然后如果还有剩余,就从尾往头扫,尽量取,让他恰好超额 不过并不懂证明. 实现: #include <i ...

  4. [BZOJ2002][Hnoi2010]Bounce弹飞绵羊 LCT

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 建图,每次往后面跳就往目标位置连边,将跳出界的点设为同一个点.对于修改操作发现可以用 ...

  5. 使用Intellij IDEA的Bookmarks

    用idea的时候,无意中发现了了一个小功能,叫做BookMark Ctrl+F11按出来的然后去查阅了一下文档,主要功能也就是可以清晰的看到自己标的书签附近的代码,比如我们在第11行按一下F11插入一 ...

  6. webgl 的空间变换(下):空间变换

    在网上看了很多关于在三维世界中怎么把一个顶点经过一步步变化,最终呈现在我们的屏幕上的. 其实很多博客或者书籍已经讲的很清楚了,那为什么我还要特别再写一次博客来阐述自己观点呢?(这里只针对那些学习web ...

  7. 10 Steps To be a senior programmer

    What 软件工程师的职业生涯要历经以下几个阶段:初级.中级,最后才是高级.这篇文章主要是讲如何通过 10 个步骤助你成为一名高级软件工程师. Why 得到更多的报酬!因为你的薪水会随着你水平的提高而 ...

  8. 01Oracle Database

    Oracle Database Oracle Database又名Oracle RDBMS简称Oracle是甲骨文公司的一款关系数据库管理系统. Oracle Website.

  9. zabbix4.2学习笔记--监控nginx

    图解一个客户端连接开源版本的Nginx情况 Accepts(接受).Handled(已处理).Requests(请求数)是一直在增加的计数器.Active(活跃).Waiting(等待).Readin ...

  10. opencv笔记

    加载图像: OpenCV支持图像格式Windows位图(bmp),便携式图像格式(pbm,pgm,ppm)和Sun光栅(sr,ras). Mat image = imread( imageName, ...