【ARC082E】ConvexScore
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的更多相关文章
- 【Atcoder】ARC082 E - ConvexScore
		
[算法]计算几何 [题意]给定平面直角坐标系上的若干个点,任意选点连成凸多边形,凸多边形的价值定义为2^(n-|S|),其中n为凸多边形内部点数(含边界),|S|为顶点数,求总价值.n<=10^ ...
 - Python高手之路【六】python基础之字符串格式化
		
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
 - 【原】谈谈对Objective-C中代理模式的误解
		
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
 - 【原】FMDB源码阅读(三)
		
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
 - 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
		
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
 - 【调侃】IOC前世今生
		
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
 - Python高手之路【三】python基础之函数
		
基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...
 - Python高手之路【一】初识python
		
Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...
 - 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】
		
说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...
 
随机推荐
- 网络对抗技术 2017-2018-2 20152515 Exp1 PC平台逆向破解 笔记
			
Exp1 PC平台逆向破解 1.堆栈不可保护: ROP 2.alsr 随机化: 填充NOPS "\90" 3.不加堆栈保护 shellcode: 1.不依赖外部函数 2.不含\00 ...
 - 20155235 《网络攻防》 实验九 Web安全基础
			
20155235 <网络攻防> 实验九 Web安全基础 实验内容 SQL注入攻击 XSS攻击 CSRF攻击 WebGoat WebGoat是OWASP组织研制出的用于进行web漏洞实验的应 ...
 - libgdx学习记录22——3d物体创建
			
libgdx是一个强大的游戏框架,不仅支持2d部分,同时还支持3d部分. libgdx的3d部分投影主要通过PerspectiveCamera实现. 物体的显示过程: 1. 创建远景相机,角度一般设为 ...
 - 联想拯救者15-isk安装固态硬盘与系统迁移教程
			
一.固态选择 首先知道拯救者15-ISK是m.2接口2280尺寸,支持PCIE协议NVMe接口标准.我加装的固态是HP EX900系列250G M.2 NVMe固态硬盘. 二.开盖安装 1.拯救者15 ...
 - 教你用PS制作雨天窗户上透明水滴字
			
雨天窗户上透明水滴字制作方法很简单,主要利用图层样式来实现.学习后可以让你对图层样式有更好的了解,认识. 先看下完成后的效果图: 步骤1: 在Photoshop中我们新建或Ctrl+N,创建1920x ...
 - 金蝶盘点机PDA条码数据采集器WMS系统具体有哪些功能
			
1. 使用汉码盘点机PDA实现仓库条码管理的好处 (1) 传统电脑管理软件出入库需要来回电脑跑人工手工电脑录单效率低,通过人眼识别商品品种和清点商品数量,容易造成录单错误.从而造成电脑管理软件库存 ...
 - pytorch 对变长序列的处理
			
一开始写这篇随笔的时候还没有了解到 Dateloader有一个 collate_fn 的参数,通过定义一个collate_fn 函数,其实很多batch补齐到当前batch最长的操作可以放在colla ...
 - [T-ARA][내가 너무 아파][我很痛]
			
歌词来源:http://music.163.com/#/song?id=5402882 作曲 : 新沙洞老虎/崔圭成 [作曲 : 新沙洞老虎/崔圭成] 作词 : 新沙洞老虎/崔圭成 [作词 : 新沙洞 ...
 - Final互评------《弹球学成语》---- 杨老师粉丝群
			
一.基于NABCD评论作品,及改进建议 1.根据(不限于)NABCD评论作品的选题; N(Need,需求):本产品面相青少年及小学生,基于这些用户数量再加上一些休闲玩家,需求量还是比较大的. A ...
 - 第一次scrum meeting
			
在这次会议中,我们确定了任务的具体分配.这里截取一部分,每个人都有20个小时左右的编程任务,整个项目共计约140小时. 明天是正式开始软件实现的第一天,下面列出前两天每个人的任务: 第一天 第二天 ...