AtCoder ARC 082E - ConvexScore
Posted SiuGinHung
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AtCoder ARC 082E - ConvexScore相关的知识,希望对你有一定的参考价值。
传送门:http://arc082.contest.atcoder.jp/tasks/arc082_c
本题是一个平面几何问题。
在平面直角坐标系中有一个n元点集U={Ai(xi,yi)|1≤i≤n}。考虑以U的子集S中的点为顶点围成的凸多边形P,若这个凸多边形P内(含边界)的点数为k,则这个子集S的权值为f(S)=2k-|S|。求所有子集S的权值之和$\sum_{S\subseteq U}f(S)$(对998,244,353取余)。
定义一个点集上的凸包运算H:G→S。即:平面上的一个点集G,有凸包S=H(G)。
设凸多边形P内的点(除顶点外)构成的集合为T,则|T|=k-|S|。于是,f(S)=2|T|,即f(S)为T的子集个数。设T’是T的一个子集,则:由于集合S=H(S∪T’),即S为S∪T’的凸包,故集合S∪T’对f(S)的贡献为1。
于是,对于U的一个子集G,若凸多边形P的顶点集为H(G),则集合G对ans的贡献为1。因此,在不考虑多点共线的前提下,$ans=\card{G|G\subseteq U,G\ge 3}=2^n -(C_{n}^{2}+n+1)$。
若考虑多点共线的情形,则枚举之。设1≤j<i≤n,记L(i,j)={Ak|Ak on AiAj,1≤k<j<i≤n},则在G≥2的情形下,凸包面积为0的情况数为$\sum_{1\ge j\ge i\ge n}2^{|L(i,j)|}$。
因此,$ans=\card{G|G\subseteq U,G\ge 3}-\sum_{1\ge j\ge i\ge n}2^{|L(i,j)|}。
参考程序如下:
#include <stdio.h> #define MAX_N 201 #define MOD 998244353 int x[MAX_N], y[MAX_N], p[MAX_N]; int main(void) { int n; scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d%d", &x[i], &y[i]); p[0] = 1; for (int i = 0; i < n; i++) p[i + 1] = (p[i] << 1) % MOD; int ans = p[n] - n - 1; for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { int cnt = 0; for (int k = 0; k < j; k++) { if ((x[i] - x[j]) * (y[i] - y[k]) == (x[i] - x[k]) * (y[i] - y[j])) cnt++; } ans -= p[cnt]; ans += MOD; ans %= MOD; } } printf("%d\n", ans); return 0; }
以上是关于AtCoder ARC 082E - ConvexScore的主要内容,如果未能解决你的问题,请参考以下文章