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. 力扣448(java)-找到数组中所有消失的数(简单)

    题目: 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果. 示例 ...

  2. 进一步释放技术红利,阿里云推出全新内存增强型实例re6,性能提升30%

    5月7日,国内最大云计算厂商阿里云宣布推出全新一代内存增强型实例,提供1:14.8超大内存比内存容量,满足内存型数据库如SAP HANA.Redis等应用,充分释放技术红利,帮助线下企业快速上云,完成 ...

  3. 解读如何安全快速建立IT治理环境

    ​简介:云计算经过十多年的发展,从基础的IAAS,大数据,到各种的PaaS有丰富的产品和生态,非常有效地助力了业务增长和技术创新,并提高了业务的效率.最直观的感受是过去需要几天到一个月的资源交付,现在 ...

  4. Flink 1.13,面向流批一体的运行时与 DataStream API 优化

    简介: 在 1.13 中,针对流批一体的目标,Flink 优化了大规模作业调度以及批执行模式下网络 Shuffle 的性能,以及在 DataStream API 方面完善有限流作业的退出语义. 本文由 ...

  5. 在线运行代码的 PHP 沙盒环境实现

      演示: 多版本PHP运行代码 作用: 方便作为独立的调试环境运行 一些 临时逻辑,查看执行结果. 方便比较不同版本的 PHP 执行差异,进行一般的兼容性测试. 思路: Docker镜像构建多个PH ...

  6. dotnet 修复 GitHub Action 构建过程提示 NETSDK1127 错误

    本文告诉大家,如何修复 GitHub Action 构建过程提示 error NETSDK1127: The targeting pack Microsoft.WindowsDesktop.App.W ...

  7. 2018-11-19-WPF-使用-SharpDX-在-D3DImage-显示

    title author date CreateTime categories WPF 使用 SharpDX 在 D3DImage 显示 lindexi 2018-11-19 15:38:35 +08 ...

  8. ESP32 多线程入门实验

    一.线程创建函数 函数 void xTaskCreate ( pdTASK_CODE pvTaskCode, const portCHAR * const pcNane, unsigned portS ...

  9. SAP集成技术(十二)SAP PO

    集成工作的一个重要部分是基于流程的集成,而在SAP环境中实现接口需求的众所周知的产品是SAP Process Orchestration(以下简称SAP PO). 现代集成架构通常使用中央系统来控制和 ...

  10. LLM实战:LLM微调加速神器-Unsloth + LLama3

    1. 背景 五一结束后,本qiang~又投入了LLM的技术海洋中,本期将给大家带来LLM微调神器:Unsloth. 正如Unsloth官方的对外宣贯:Easily finetune & tra ...