题意:

给出n个点,n个点共有2^n-1个点集,不包括空集。求每一个点集构成的凸包的面积总和。(n <= 1000)

思路:

由于n比较小,可以考虑n^2复杂度的算法。然后可以想到先枚举一个点i,然后再枚举一个点,就可以构成一条边,但是边和凸包有什么关系呢?考虑到求的是凸包面积,凸包的面积是凸包上的点依次叉乘,即凸包的面积,每条边都有其对应的贡献值。因此本题就变成了枚举两个点,然后求有多少个点可以与这两个点构成一个凸包的问题。

很容易考虑到极角排序,枚举一个点 i,然后以这个点为中心点对其它所有点进行极角排序,再枚举另一个点 j,则i与j构成的边的左半部分区域P1中的所有点的任意非空子集,与点i和点j形成的凸包中,点i与点j一定是凸包上的边。并且在这个凸包上,j刚好是i逆时针方向上的点。凸包求面积的时候,按照逆时针方向逐个计算,因此当前这种情况是唯一的,不存在重复计算。以 j 为中心点,再枚举 i 形成的凸包与以 i 为中心点,再枚举 j 形成的凸包是不同的。

此时还要注意几个细节,图中的点A与点B是不计算到P1区域中点的,因为若这个凸包加入点A或点B,形成的凸包的边就是Bj了,而不是ij。我们只将于i、j同侧的共线点算入点的个数中,不将A、B算入点的个数中。

极角排序后,判断两点的旋转距离是否大于180度,可以事先求出每个点的极角度数,然后就可以方便的比较。我一开始用叉积来判断是否大于180度,发现总是有很多情况没有考虑到,比如是否是自己这一侧的共线点,有无长度为0的点等情况,一直wa,只好放弃改为求极角度数。如果可以用叉积来判断180度,请告知,万分感谢。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
#define LOG4(x1,x2,y1,y2,z1,z2,h1,h2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << " , " << z1 << ": " << z2 << " , " << h1 << ": " << h2 << endl;
#define pi acos(-1.0)
#define cross(p1,p2,p3) ((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y)) //向量(p1,p2)与(p1,p3)叉乘
#define crossOp(p1,p2,p3) sign(cross(p1,p2,p3)) //判断正负,顺时针为负, 为0则代表三点共线
using namespace std;
typedef long long ll;
//实数比较
typedef double db;
const db EPS = 1e-9;
inline int sign(db a) {return a < -EPS ? -1 : a > EPS; } //返回-1表示a < 0, 1表示a > 0, 0表示a = 0
inline int cmp(db a, db b) {return sign(a-b); } //返回-1表示a < b, 1表示a > b,0表示 a==b
const ll mod = 998244353;//点类
struct P {ll x,y;db ang;P() {}P(ll _x, ll _y, ll _z) : x(_x), y(_y), ang(_z) {}ll dot(P p) { return x*p.x+y*p.y; } //点积ll det(P p) { return x*p.y-y*p.x; } //叉积bool operator<(P p) const {return ang < p.ang;}
}am[2000],tp[2000];int n;
ll ans,poww[2000];int main()
{poww[0] = 1; rep(i,1,1010) poww[i] = (poww[i-1]*2)%mod;int _;scanf("%d",&_);while(_--){ans = 0; scanf("%d",&n);rep(i,1,n) scanf("%lld%lld",&am[i].x,&am[i].y);rep(i,1,n){rep(j,1,n) tp[j] = am[j], tp[j].ang = atan2(am[j].y-am[i].y,am[j].x-am[i].x);tp[i] = tp[n]; sort(tp+1,tp+n);rep(j,n,2*n-2) tp[j] = tp[j-n+1], tp[j].ang += 2*pi;int l = 1, r = 1;while(l <= n-1){while(r <= 2*n-2 && tp[r].ang-tp[l].ang < pi) r++;ans = (ans + mod + (((am[i].det(tp[l])+mod)%mod)*(poww[r-l-1]-1))%mod)%mod;l++;}}printf("%lld\n",ans);}return 0;
}

【15年浙江省赛 C ZOJ 3871】Convex Hull【极角排序】相关推荐

  1. 【ZJCPC2018 第15届 浙江省赛】The 15th Zhejiang Provincial Collegiate Programming Contest(MABLJK 6题)

    补题地址:https://zoj.pintia.cn/home/news 搜索15th 本文按照通过率补的题 M. Lucky 7 题意:如果存在从给出的长为n的序列中选择一个数+b 可以被7整除,就 ...

  2. 【2016浙江省赛:区间取模】E : Modulo Query | ZOJ - 3940

    2016浙江省赛:E 题 Modulo Query [难度] 4.5/104.5/104.5/10 据说是卡银题?感觉有点难 [题意] F(i,X)={XmodA1i=1F(i−1,X)modAi2≤ ...

  3. 2014年11月15日SIE赛意公司面试

    2014年11月15日SIE赛意公司面试 昨晚收到SIE(赛意)公司的面试通知,群面+单面共2个小时,今天中午就屁颠屁颠得跑到体育中心了.话休烦絮,直接进入正题. 1点半的面试,到公司门口已经1点15 ...

  4. 2021浙江省赛题解(A,C,F,G,J,L,M)

    2021浙江省赛题解(A,C,F,G,J,L,M) A.League of Legends 题解 签到题 直接求和判断一下 注意会爆 i n t int int以及相等的情况. 代码 #include ...

  5. 2022浙江省赛、ICPC昆明区域赛 游·寄

    前夜 周六打的浙江省赛.周日昆明区域赛,周五平常作息,早上和爸妈聊天 我说道 金华疫情情况还好,还能出校吃饭,没想到 噩耗马上就来了.金华突然有了几例阳性,其中有一位还是滴滴司机.线上教学的消息已发出 ...

  6. uva 10256 The Great Divide (Convex Hull, Simple)

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=14&page=sh ...

  7. Monotone Chain Convex Hull(单调链凸包)

    1 Monotone Chain Convex Hull(单调链凸包)算法伪代码: 2 //输入:一个在平面上的点集P 3 //点集 P 按 先x后y 的递增排序 4 //m 表示共a[i=0...m ...

  8. Two Dimensional Convex Hull

    Two Dimensional Convex Hull 二维凸包 译 by Felicia Crazy (QQ 125376968 MSN felicia1101@hotmail.com ) 准备知识 ...

  9. R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集)、ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull)

    R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集).ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull) 目录

  10. 寻找凸包 (Convex Hull)

    凸包问题是算法中经典的题目了,最近算法课讲分治问题时提到了Convex Hull,算法导论的书上也花了篇幅讨论了Convex Hull的求解,主要是Graham方法. 为了能更好地理解分治和Graha ...

最新文章

  1. 实战之网马解密之shellcode篇
  2. 判断一个点是否在RotatedRect中
  3. pd16.5生成mysql列说明_PowerDesigner16逆向工程生成PDM列注释(My Sql5.0模版)
  4. centos6.5下安装配置ELK及收集nginx日志
  5. ​亚马逊出品:非均匀扰动的对抗鲁棒性理论分析
  6. android 按钮中断,android – 如何“中断”在AccessibilityService中执行的操作?
  7. android: 调用摄像头拍照
  8. 剑指offer之从上到下打印二叉树
  9. CentOs基础操作指令(压缩、定时任务调度)
  10. 使用TensorFlow.js从网络摄像头进行实时AI情感检测
  11. mysql外键_MySQL外键约束(FOREIGN KEY)
  12. oracle数据库十六进制转字符串,Oracle中各种进制相互转换
  13. Hadoop的基本结构介绍(原创)
  14. EXCHANGE服务器一些常用的邮件限制方法笔记
  15. Java学习笔记-全栈-web开发-14-Spring入门AOP编程Spring注解开发Spring事务
  16. 一级计算机手机试题app,计算机一级考试题库
  17. 人工智能重新定义管理
  18. 3月6日服务器例行维护公告,热血江湖官方网站·系统公告
  19. linux 拼音输出繁体_ubuntu输入法是繁体 寻找Ubuntu中繁体字输入法 - Linux - 服务器之家...
  20. 实战例子:Solidity代码小失误导致池子里60万U被盗空

热门文章

  1. zwPython,字王集成式python开发平台,比pythonXY更强大、更方便。
  2. 国外值得关注的网站系列之一
  3. 幂次方计算_4.初中数学:怎么求n的m次方的值?幂的运算,单项式相乘,基础常见考试题...
  4. http | 状态码
  5. mysql 优化代码_Mysql语句-优化代码
  6. nginx gif伪装php,nginx空白图片(empty_gif模块)
  7. 软件功能测试怎么把关指标,软件测试方法经与验.doc
  8. qsort和sort的区别
  9. 【CF585-div2:D】Ticket Game(博弈)
  10. 【天梯选拔月赛】寻宝路线(dp)