CF437E The Child and Polygon
The Child and Polygon 题解
这世界这么大,遇到了这个奇奇怪怪的题。
这道题其实可以很自然的联想到卡特兰数。
在卡特兰数的计数中,有这么一个意义:\(C_n\) 表示把有 \(n+2\) 条边的凸多边形分成 \(n\) 个三角形的方案数。
利用这个意义可以得到 \(C_n\) 的另一个递推关系:
\]
而这一道题,正可以类比这个递推关系进行求解。
思路
在卡特兰数递推中,\(k\) 实际上枚举的是最后一次的分界点。也就是把整个多边形分成两部分,分别划分,再求最终方案数。
首先我们将已知的 \(n\) 个点按照顺时针方向排好序。
类比下来,我们可以設 \(f_{i, j}\) 表示由 \(i \sim j\) 这 \(j - i + 1\) 个点形成的多边形的划分数。
于是
\]
这里 \(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的更多相关文章
- Codeforces 437E The Child and Polygon(间隔DP)
题目链接:Codeforces 437E The Child and Polygon 题目大意:给出一个多边形,问说有多少种切割方法.将多边形切割为多个三角形. 解题思路:首先要理解向量叉积的性质,一 ...
- Codeforces 437E The Child and Polygon
http://codeforces.com/problemset/problem/437/E 题意:求一个多边形划分成三角形的方案数 思路:区间dp,每次转移只从一个方向转移(L,R连线的某一侧),能 ...
- CodeForces Round #250 Div2
A. The Child and Homework 注意仔细读题,WA了好多次,=_= #include <cstdio> #include <cstring> #includ ...
- SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息
原文:SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2 ...
- Codeforce 水题报告(2)
又水了一发Codeforce ,这次继续发发题解顺便给自己PKUSC攒攒人品吧 CodeForces 438C:The Child and Polygon: 描述:给出一个多边形,求三角剖分的方案数( ...
- MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...
- [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6
原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Act ...
- [LeetCode] Convex Polygon 凸多边形
Given a list of points that form a polygon when joined sequentially, find if this polygon is convex ...
- 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 ...
- 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项
首先在利用 GEOGRAPHY::STPolyFromText(@GeoStr, 4326) 这样的函数把字符串转换为Geography类型时,字符串里经纬度的顺序是 “经度[空格]纬度”,即“lon ...
随机推荐
- 力扣448(java)-找到数组中所有消失的数(简单)
题目: 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果. 示例 ...
- 进一步释放技术红利,阿里云推出全新内存增强型实例re6,性能提升30%
5月7日,国内最大云计算厂商阿里云宣布推出全新一代内存增强型实例,提供1:14.8超大内存比内存容量,满足内存型数据库如SAP HANA.Redis等应用,充分释放技术红利,帮助线下企业快速上云,完成 ...
- 解读如何安全快速建立IT治理环境
简介:云计算经过十多年的发展,从基础的IAAS,大数据,到各种的PaaS有丰富的产品和生态,非常有效地助力了业务增长和技术创新,并提高了业务的效率.最直观的感受是过去需要几天到一个月的资源交付,现在 ...
- Flink 1.13,面向流批一体的运行时与 DataStream API 优化
简介: 在 1.13 中,针对流批一体的目标,Flink 优化了大规模作业调度以及批执行模式下网络 Shuffle 的性能,以及在 DataStream API 方面完善有限流作业的退出语义. 本文由 ...
- 在线运行代码的 PHP 沙盒环境实现
演示: 多版本PHP运行代码 作用: 方便作为独立的调试环境运行 一些 临时逻辑,查看执行结果. 方便比较不同版本的 PHP 执行差异,进行一般的兼容性测试. 思路: Docker镜像构建多个PH ...
- dotnet 修复 GitHub Action 构建过程提示 NETSDK1127 错误
本文告诉大家,如何修复 GitHub Action 构建过程提示 error NETSDK1127: The targeting pack Microsoft.WindowsDesktop.App.W ...
- 2018-11-19-WPF-使用-SharpDX-在-D3DImage-显示
title author date CreateTime categories WPF 使用 SharpDX 在 D3DImage 显示 lindexi 2018-11-19 15:38:35 +08 ...
- ESP32 多线程入门实验
一.线程创建函数 函数 void xTaskCreate ( pdTASK_CODE pvTaskCode, const portCHAR * const pcNane, unsigned portS ...
- SAP集成技术(十二)SAP PO
集成工作的一个重要部分是基于流程的集成,而在SAP环境中实现接口需求的众所周知的产品是SAP Process Orchestration(以下简称SAP PO). 现代集成架构通常使用中央系统来控制和 ...
- LLM实战:LLM微调加速神器-Unsloth + LLama3
1. 背景 五一结束后,本qiang~又投入了LLM的技术海洋中,本期将给大家带来LLM微调神器:Unsloth. 正如Unsloth官方的对外宣贯:Easily finetune & tra ...