链接 https://codeforces.com/problemset/problem/1284/E

题意:平面上有n个点,问你存在多少组四个点围成的四边形 严格包围某个点P的情况。不存在三点共线。

思路:首先看数据范围是2500,可以做n^2的枚举,我们可以枚举两遍n。正面求解有些困难,反面求解可以考虑有多少组子集不满足题目要求,拿总的子集数量减去不满足的就是答案。

那么考虑不满足题意的点集。

首先如果对于一对点P和P1,让它们连线,以P为基准,相对度数为0度,枚举P和P1这个条线以上的所有点,假设枚举出n个点,n个点加P1,从中选出4个点,这4个点组成的四边形必定不含点P,以此性质

首先做一遍极角排序,然后固定一条边,以这条边为0度,开始扫描这条边0到180度的所有点,然后从中任意选出3个点C(n,3),与P1组成的四边形便不封闭包围P1,统计所有不满足条件的点集,用总体点集

个数C(n,5)- 不满足的组合个数 就是答案了。

(如图所示,P1,P2,P3,P4组成的四边形不封闭包围点P。)

AC代码:

 #include<iostream>
#include<vector>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const long double pi = acos(-.0L);
const int maxn = 2e3+;
long double x[maxn],y[maxn];
int main()
{
int n;cin>>n;
ll ans = (ll)n*(n-)*(n-)*(n-)*(n-)/;
for(int i = ;i<n;i++){
ll xi,yi;
cin>>xi>>yi;
x[i] = xi,y[i] = yi;
}
for(int i = ;i<n;i++){
vector<long double> v;
for(int j = ;j<n;j++){
if(i == j) continue;
v.push_back(atan2(y[j]-y[i],x[j]-x[i])); //算一下角度
}
sort(v.begin(),v.end());//做极角排序
int k = n - , cur = ;
for(int j = ;j<k;j++){
while(cur < j+k){ //枚举点个数增加一倍
long double angle = v[cur%k] - v[j];//枚举两条边的夹角
if(angle < ) angle+=*pi;//如果角度小于0,则增加2*pi转一圈
if(angle < pi) cur++;//如果该点在枚举的这条线上面,则cur++
else break;
}
long long cnt = cur - j - ;
ans-=1ll*cnt*(cnt-)*(cnt-)/;
}
}
cout<<ans;
return ;
}

codeforces 1284E. New Year and Castle Construction(极角排序+扫描枚举)的更多相关文章

  1. poj2280Amphiphilic Carbon Molecules(极角排序)

    链接 卡了几天的破题,对于hdu的那份数据,这就一神题.. 借助极角排序,枚举以每一个点进行极角排序,然后构造两条扫描线,一个上面一个下面,两条同时走,把上线和下线的点以及上线左边的点分别统计出来,如 ...

  2. 【极角排序+双指针线性扫】2017多校训练七 HDU 6127 Hard challenge

    acm.hdu.edu.cn/showproblem.php?pid=6127 [题意] 给定平面直角坐标系中的n个点,这n个点每个点都有一个点权 这n个点两两可以连乘一条线段,定义每条线段的权值为线 ...

  3. bzoj 2087: [Poi2010]Sheep【凸包+极角排序+dp】

    首先处理处理出来哪些边能连--能把羊分成两个偶数部分的,实现是在凸包上枚举极点,极角排序,枚举凸包上点对判断两边羊的个数的奇偶即可,设可以连边为v[i][j]=1 然后设f[i][j]为从i到j个凸包 ...

  4. Educational Codeforces Round 1 C. Nearest vectors 极角排序

    Partial Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/598/problem/ ...

  5. [置顶] Codeforces 70D 动态凸包 (极角排序 or 水平序)

    题目链接:http://codeforces.com/problemset/problem/70/D 本题关键:在log(n)的复杂度内判断点在凸包 或 把点插入凸包 判断:平衡树log(n)内选出点 ...

  6. CF Hello 2020 E.New Year and Castle Construction

    E.New Year and Castle Construction 题意 给定n个点,对于每个点\(p\),求出4-point 子集(该子集有四个点,并且围成的圈包含\(p\))的个数 数据给的点中 ...

  7. Codeforces Round #124 (Div. 1) C. Paint Tree(极角排序)

    C. Paint Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  8. codeforces 598C C. Nearest vectors(极角排序)

    题目链接: C. Nearest vectors time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  9. Codeforces 196C Paint Tree(贪心+极角排序)

    题目链接 Paint Tree 给你一棵n个点的树和n个直角坐标系上的点,现在要把树上的n个点映射到直角坐标系的n个点中,要求是除了在顶点处不能有线段的相交. 我们先选一个在直角坐标系中的最左下角的点 ...

随机推荐

  1. tcp客户端从服务器下载文本文件

    代码讲解: server import socket def send_file_client(new_client_socket, new_client_addr): # 接收客户端需要下载的文件名 ...

  2. MySQL系列(一):谈谈MySQL架构

    MySQL整体架构 与所有服务端软件一样,MySQL采用的也是C/S架构,即客户端(Client)与服务端(Server)架构,我们在使用MySQL的时候,都是以客户端的身份,发送请求连接到运行服务端 ...

  3. Java-天平称重

    题目: 用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81 则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中).本题 ...

  4. 使用ASP.NET Core 3.x 构建 RESTful API - 4.1 面向外部的Model

    Entity Framework Core 使用的 Entity Model 是用来表示数据库里面的记录的. 而面向外部的 model 则表示了要传输的东西.这类 model 有时候叫做 Dto,有时 ...

  5. gulp常用插件之gulp-babel使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-babel这是Babel的Gulp插件. 此自述文件适用于gulp-babel v8 + Babel v7检查7.x分支以了解使用Bab ...

  6. Linux 基础操作命令

    关机和注销 shutdown -h now 立刻关机 shutdown -r now 立刻重启 shutdown -h + 1分钟后关机(重启同样用法) shutdown -h : 11点钟关机(重启 ...

  7. Wannafly Winter Camp 2020 Day 5I Practice for KD Tree - 二维线段树

    给定一个 \(n \times n\) 矩阵,先进行 \(m_1 \leq 5e4\) 次区间加,再进行 \(m_2 \leq 5e5\) 次询问,每次询问要求输出矩形区间内的最大数.\(n \leq ...

  8. 01、学习c++必知的几个网站

    1.https://zh.cppreference.com/ 2.http://www.cplusplus.com/ 3.https://gcc.gnu.org/onlinedocs/libstdc+ ...

  9. php 获取视频时长

    利用ffmpeg只能获取到本地视频的信息. function video_time($file) { ob_start(); passthru(sprintf(FFMPEG_PATH, $file)) ...

  10. C 库函数 - modf()

    C 库函数 - modf() C 标准库 - <math.h> 描述 C 库函数 double modf(double x, double *integer) 返回值为小数部分(小数点后的 ...