The Child and Polygon 题解

这世界这么大,遇到了这个奇奇怪怪的题。

这道题其实可以很自然的联想到卡特兰数。

在卡特兰数的计数中,有这么一个意义:\(C_n\) 表示把有 \(n+2\) 条边的凸多边形分成 \(n\) 个三角形的方案数。

利用这个意义可以得到 \(C_n\) 的另一个递推关系:

\[C_n = \sum_{k = 0}^{n - 1} {C_k C_{n-1-k}}
\]

而这一道题,正可以类比这个递推关系进行求解。

思路

在卡特兰数递推中,\(k\) 实际上枚举的是最后一次的分界点。也就是把整个多边形分成两部分,分别划分,再求最终方案数。

首先我们将已知的 \(n\) 个点按照顺时针方向排好序。

类比下来,我们可以設 \(f_{i, j}\) 表示由 \(i \sim j\) 这 \(j - i + 1\) 个点形成的多边形的划分数。

于是

\[f_{i, j} = \sum_{k = i}^{j} {f_{i, k} f_{k, j}} [i 可以连向 k]
\]

这里 \(i\) 可以连向 \(k\) 当且仅当线段 \(\vec{ij}\) 在线段 \(\vec{ik}\) 的顺时针方向。

于是本题的核心思路就已经出来了。接下来考虑实现问题。

实现

逆时针,顺时针?

我们可以通过向量叉乘的方法来判断所给的点是顺时针还是逆时针。

考虑按照所给的点的顺序计算这个多边形的面积。

枚举 \(i\) 利用 \(\vec{1i}\) 和 \(\vec{1(i+1)}\) 的叉乘,可以算出整个多边形的面积(的两倍)。

但是考虑到叉乘的正负性,如果结果为正,则所给的顺序为逆时针(因为 \(\vec{1i}\) 在 \(\vec{1(i+1)}\) 的顺时针方向)。

此时就可以搞定逆时针,顺时针的问题了。

可连?不可连?

在前面已经提到,\(i\) 可以连向 \(k\) 的条件,如何判断?

还是利用 \(\vec{ij} \times \vec{ik}\),如果结果为正,则 \(\vec{ij}\) 在 \(\vec{ik}\) 的顺时针方向,可以连。


于是你成功的可以 \(\texttt{\colorbox{#52C41A}{\textcolor{white}{AC}}}\) 本题了。

代码

#include <iostream>
#include <algorithm>
#include <cstring> using namespace std;
const int N = 203, mod = 1e9 + 7;
typedef long long lint;
struct Point {
int x, y;
Point() {}
Point(int x, int y) : x(x), y(y) {}
inline lint operator * (const Point &p) {
return (1ll * x * p.y - 1ll * y * p.x);
} inline Point operator - (const Point &p) {
return Point(x - p.x, y - p.y);
}
} p[N]; lint dp[N][N]; int main() {
cin.tie(0)->sync_with_stdio(false); int n; cin >> n;
for (int x, y, i = 1; i <= n; ++i) {
cin >> x >> y;
p[i] = Point(x, y);
} lint clockwiser = 0;
for (int i = 2; i < n; ++i) {
clockwiser += (p[i] - p[1]) * (p[i + 1] - p[1]);
} if (clockwiser > 0) // if is positive, the it is counterclockwise
reverse(p + 1, p + 1 + n); for (int i = 1; i < n; ++i)
dp[i][i + 1] = 1; for (int len = 2; len < n; ++len) {
for (int l = 1, r = len + 1; r <= n; ++l, ++r) {
for (int k = l; k <= r; ++k) {
if ((p[r] - p[l]) * (p[k] - p[l]) > 0)
dp[l][r] = (dp[l][r] + 1ll * dp[l][k] * dp[k][r] % mod) % mod;
}
}
} cout << dp[1][n] << '\n';
}

CF437E The Child and Polygon的更多相关文章

  1. Codeforces 437E The Child and Polygon(间隔DP)

    题目链接:Codeforces 437E The Child and Polygon 题目大意:给出一个多边形,问说有多少种切割方法.将多边形切割为多个三角形. 解题思路:首先要理解向量叉积的性质,一 ...

  2. Codeforces 437E The Child and Polygon

    http://codeforces.com/problemset/problem/437/E 题意:求一个多边形划分成三角形的方案数 思路:区间dp,每次转移只从一个方向转移(L,R连线的某一侧),能 ...

  3. CodeForces Round #250 Div2

    A. The Child and Homework 注意仔细读题,WA了好多次,=_= #include <cstdio> #include <cstring> #includ ...

  4. SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息

    原文:SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2 ...

  5. Codeforce 水题报告(2)

    又水了一发Codeforce ,这次继续发发题解顺便给自己PKUSC攒攒人品吧 CodeForces 438C:The Child and Polygon: 描述:给出一个多边形,求三角剖分的方案数( ...

  6. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  7. [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6

    原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Act ...

  8. [LeetCode] Convex Polygon 凸多边形

    Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...

  9. php php-5.6.4.tar.bz2 apache 兼容问题 child pid 27858 exit signal Segmentation fault

    环境 [root envirotar]# uname -a Linux i2..el6.x86_64 # SMP Thu Jul :: UTC x86_64 x86_64 x86_64 GNU/Lin ...

  10. 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项

    首先在利用 GEOGRAPHY::STPolyFromText(@GeoStr, 4326) 这样的函数把字符串转换为Geography类型时,字符串里经纬度的顺序是 “经度[空格]纬度”,即“lon ...

随机推荐

  1. LRU缓存及其实现

    缓存是我们日常开发中来提高性能最直接的方式,经常会听到有人说:性能不行?是因为你没加缓存!常见的缓存有外部缓存服务以及程序内部缓存,外部缓存服务包括:Redis.Memcached等,内部缓存就是我们 ...

  2. gRPC入门学习之旅(七)

    gRPC入门学习之旅(一) gRPC入门学习之旅(二) gRPC入门学习之旅(三) gRPC入门学习之旅(四) gRPC入门学习之旅(五) gRPC入门学习之旅(六) 3.6.创建gRPC的桌面应用客 ...

  3. 力扣1076(MySQL)-员工项目Ⅱ(简单)

    题目: 编写一个SQL查询,报告所有雇员最多的项目. 查询结果格式如下所示:  解题思路: 方法一:将两个表联结,以project_id进行分组,统计员工数降序排序,然后筛选出第一条数据. 1 sel ...

  4. 国庆集训 Day1 复盘笔记

    9.25 \({\color{Green} \mathrm{A\ -\ Powered\ Addition}}\) 只要把序列扫一遍,然后求出目前最大值与当前值的差的最大值 \(x\),再 \(log ...

  5. 超详攻略!Databricks 数据洞察 - 企业级全托管 Spark 大数据分析平台及案例分析

    简介: 5分钟读懂 Databricks 数据洞察 ~ 更多详细信息可登录 Databricks 数据洞察 产品链接:https://www.aliyun.com/product/bigdata/sp ...

  6. [Contract] Solidity 合约使用 truffle 部署到测试网和主网

    使用 truffle 发布到非本地的以太坊主网或者测试网时,需要提供钱包的助记词或私钥. 首先安装 truffle 组件:npm install @truffle/hdwallet-provider ...

  7. dotnet 警惕 ConcurrentDictionary 使用 FirstOrDefault 获取到非预期的首项

    在 dotnet 里面的 ConcurrentDictionary 是一个支持并发读写的线程安全字典,在这个字典里面有一些行为会出现随机性,即多次执行相同的代码返回的结果可能不相同.本文记录在 Con ...

  8. VSCode 中安装 esp-idf

    一.准备工具 首先需要安装好 VSCode 软件和 esp-idf 环境. 安装 VSCode VSCode 安装比较简单,我就不赘述了,进入官网下载一键安装即可 VSCode官网:https://c ...

  9. 微软开源 MS-DOS「GitHub 热点速览」

    上周又是被「大模型」霸榜的一周,各种 AI.LLM.ChatGPT.Sora.RAG 的开源项目在 GitHub 上"争相斗艳".这不 Meta 刚开源 Llama 3 没几天,苹 ...

  10. Phpstrom开发工具Sftp的使用