【计算几何+极角排序+爆ll】E. Convex
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的更多相关文章
- bzoj 5099 [POI2018]Pionek 计算几何 极角排序
[POI2018]Pionek Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 269 Solved: 80[Submit][Status][Disc ...
- hdu-5784 How Many Triangles(计算几何+极角排序)
题目链接: How Many Triangles Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- hrbustoj 1305:多边形(计算几何,极角排序练习)
多边形 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 113(42 users) Total Accepted: 51(3 ...
- poj 1696:Space Ant(计算几何,凸包变种,极角排序)
Space Ant Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 2876 Accepted: 1839 Descrip ...
- Gym 101986D Making Perimeter of the Convex Hull Shortest(凸包+极角排序)
首先肯定是构造一个完整的凸包包括所有的点,那么要使得刚好有两个点在外面,满足这个条件的只有三种情况. 1.两个在凸包上但是不连续的两个点. 2.两个在凸包上但是连续的两个点. 3.一个在凸包上,还有一 ...
- 【计算几何】【极角排序】【二分】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三角形. 枚举每个点作为直角顶点,对其他点极角排序,同方向的按长度排序,然后依次枚举每个向量,与其对应的另一条直角边是单调 ...
- 【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival
平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后 ...
- LightOJ 1285 - Drawing Simple Polygon (几何,极角排序)
1285 - Drawing Simple Polygon PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- HDU 5738 Eureka(极角排序)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5738 [题目大意] 给出平面中一些点,在同一直线的点可以划分为一个集合,问可以组成多少包含元素不少 ...
随机推荐
- PWA之serviceWorker应用
1.serviceWorker介绍service worker是一段运行在浏览器后台的JavaScript脚本,在页面中注册并安装成功后,它可以拦截和处理网络请求,实现缓存资源并可在离线时响应用户的请 ...
- Jboss服务器使用
一.作者前言 早上坐地铁的时候,阅览about JAVA.了解到一个程序猿,对于服务器的使用,最起码的熟悉那么几种,例如tomcat,jboss,weblogic,websphere,还有Nginx. ...
- SugarCRM安装踩雷(一)
安装SugarCRM前置条件: 1.找对平台.正确版本的安装包 2.APACHE + MYSQL + TOMCAT环境先确保OK 坑1: 进入安装参数设置步骤的MYSQL用户密码——这里根据Mysql ...
- Linux修改ssh端口,减少暴力破解
版本centos7 注意:操作时请勿断开当前的ssh连接,以免发生情况登陆不了. 1.修改的是 /etc/ssh/sshd_config 文件 打开文件之后会发现Port是注释掉的,默认为22 ...
- asterisk-java ami4 一些基本功能的例子
比如:挂机,拨号,拨外线,保留通话,示闲,示忙等等.... 在api中可以获得这些方法说明 /** * 给分机挂机 * @param Extension 要挂机的分机号 * @return * ...
- CentOS6.8 RPM包安装快速zabbix22
CentOS6.8 RPM包安装快速zabbix22 yum install -y epel-release # yum install -y httpd php php-devel mysql-se ...
- js 类似于移动端购物车删除,左移动删除
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ansible中yaml语法应用
4.yaml语法应用 ansible的playbook编写是yaml语言编写,掌握yaml语法是编写playbook的必要条件,格式要求和Python相似,具体教程参考如下 yaml语言教程 附上一个 ...
- Java 取本月第一天和最后一天
/** * 获取本月第一天 * @return */ public Date getmindate(){ Calendar calendar = Calendar.getInstance(); cal ...
- webpack4前端工程化教程(一)
-本文作为webpack小白入门文章,会详细地介绍webpack的用途.具体的安装步骤.注意事项.一些基本的配置项,并且会以一个具体的项目实例来介绍如何使用webpack.另外,本文会简单地介绍一些最 ...