Description

  

  给定二维直角坐标系上的N个点\((X_i,Y_i)\),定义一个有N个点中的部分点所构成点集为“凸点集”,当且仅当该集合内的所有点恰好构成一个面积为正的凸多边形(每个内角严格小于180°)。

  

  对于每一个凸点集S,设这N个在该点集对应凸多边形内(包括边界)的数量为m,则该凸点集对答案的贡献的为\(2^{m-|S|}\),求这N个点中每一个凸点集对答案的贡献之和。

  

  由于最终答案可能非常大,你只需输出答案在模998244353意义下的结果。

  

  

  

Solution

  

  看起来很吓人。

  

  我们先定义一个由点集到凸包外壳集的函数:\(f(S)\)表示点集\(S\)的凸包外壳点集。

  

  对于某一个点集\(S\cup T\),其中凸包外壳为\(S\),内含点集为\(T\),则其凸包外壳\(f(S+T)=S\)。整个凸包对答案的贡献为\(2^{|T|}\),即\(T\)的子集个数。对于子集\(T'\subset T\),\(f(S+T')\)都为\(S\)。我们相当于统计外壳固定时,有多少种点集不影响外壳。

  

  那么我们不就相当于把每一个凸包点集都枚举了恰好一次吗?反向考虑,任意一个有效凸包点集\(A\),我们发现其仅会在固定\(f(A)\)这个凸包外壳统计答案的时候贡献恰好一次。

  

  所以总答案变成:原图有多少个凸包....

  

  有效凸包数,等于总非空点集数,减去单点凸包\(N\),减去双点凸包\(N \choose 2\),再减去共线凸包个数。最后一个部分可以用最小/大表示法计算,即枚举每个共线凸包编号最小/大的两个点,计算这两个点的直线,再判断使用比这两个点编号大/小的点能与这两个点组成多少个共线凸包。

  

  这题要怎么说啊,首先要对那个2的幂敏感,看出子集个数的概念。如果正面想求和意义实在行不通,不妨尝试从元素贡献来反向考虑。

   

  

Code

  

#include <cstdio>
using namespace std;
const int N=205;
const int MOD=998244353;
int n;
struct Point{
int x,y;
Point(){}
Point(int _x,int _y){
x=_x; y=_y;
}
friend Point operator - (Point a,Point b){
return Point(a.x-b.x,a.y-b.y);
}
}a[N];
int pow2[N];
void readData(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
}
void initPow(){
pow2[0]=1;
for(int i=1;i<=n;i++)
pow2[i]=(pow2[i-1]<<1)%MOD;
}
int cross(Point a,Point b){
return a.x*b.y-a.y*b.x;
}
bool on_line(int i,int j,int k){
return cross(a[j]-a[i],a[k]-a[i])==0;
}
void solve(){
int ans=(1ll*pow2[n]-(1ll*n*(n-1)/2)-n-1)%MOD;
for(int i=2;i<n;i++)
for(int j=i+1;j<=n;j++){
int sum=0;
for(int k=1;k<i;k++)
if(on_line(i,j,k))
sum++;
(ans-=pow2[sum]-1)%=MOD;
}
printf("%d\n",ans<0?ans+MOD:ans);
}
int main(){
readData();
initPow();
solve();
return 0;
}

【ARC082E】ConvexScore的更多相关文章

  1. 【Atcoder】ARC082 E - ConvexScore

    [算法]计算几何 [题意]给定平面直角坐标系上的若干个点,任意选点连成凸多边形,凸多边形的价值定义为2^(n-|S|),其中n为凸多边形内部点数(含边界),|S|为顶点数,求总价值.n<=10^ ...

  2. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  3. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  4. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  6. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  7. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  8. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  9. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

随机推荐

  1. Photoshop CS4破解方法

    先在网上下载Photoshop CS4的版本,安装后按如下步骤操作即可. 激活码: 1330-1082-3503-2270-3738-6738 1330-1776-8671-6289-7706-291 ...

  2. CS190.1x-ML_lab1_review_student

    这是CS190.1x第一次作业,主要教你如何使用numpy.numpy可以说是python科学计算的基础包了,用途非常广泛.相关ipynb文件见我github. 这次作业主要分成5个部分,分别是:数学 ...

  3. R语言学习 第三篇:数据框

    数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...

  4. CSS快速入门-属性和伪类

    一.属性选择器 <div class="gradefather"> hello1 <div name="son">hello2 < ...

  5. JavaScript快速入门-ECMAScript本地对象(String)

    一.String对象 String对象和python中的字符串一样,也有很多方法,这些方法大概分为以下种类: 1.索引和查找 1.charAt()   返回指定位置的字符. 2.charCodeAt( ...

  6. Flutter - 创建底部导航栏

    之前写过的一篇文章介绍了 Flutter - 创建横跨所有页面的侧滑菜单, 这次就一起来学习一下底部导航栏. 底部导航栏在ios平台上非常常见,app store就是这样的风格.还有就是大家最常用的微 ...

  7. Java中isAssignableFrom()方法与instanceof()方法用法

    一句话总结: isAssignableFrom()方法是从类继承的角度去判断,instanceof()方法是从实例继承的角度去判断. isAssignableFrom()方法是判断是否为某个类的父类, ...

  8. Unity Dotween官方案例学习

    本文只涉及一些案例,具体查看 DoTween 官方文档. 一. Basics public class Basics : MonoBehaviour { public Transform redCub ...

  9. mac osx 初次使用PHP环境搭建

    非常简单,一共2个步骤: Step1: 启动Apache mac osx 系统默认安装Apache服务. 首先打开terminal,输入: sudo apachectl start 如果需要输入密码, ...

  10. 【Alpha】第三次Scrum meeting

    今日任务一览: 导航栏诞生 前期准备的Latex文本将撰写完毕 生成燃尽图的问题已经解决 姓名 今日完成任务 所耗时间 刘乾 用Github成功生成了燃尽图(真是不容易啊...),与架构师继续每日面基 ...