【BZOJ2087】[Poi2010]Sheep 几何+DP
【BZOJ2087】[Poi2010]Sheep
Description
Lyx的QQ牧场养了很多偶数个的羊,他是Vip,所以牧场是凸多边形(畸形)。现在因为他开挂,受到了惩罚,系统要求他把牧场全部分为三角形(划分线不能在牧场中相交,只能在顶点相交),羊也是有个性的,如果他们在三角形中是单数就会有羊自杀(Lyx的样就是畸形),这让Lyx很难办,于是他向你求助了。
Input
输入:第一行由空格隔开的3个整数n(4<=n<=600),k(2<=k<=20000),m(2<=m<=20000),n表示牧场的顶点数,k表示羊的个数(保证为偶数)。接下来n行为顶点的坐标xi、yi,(-15000<=xi,yi<=15000)由空格隔开,接下来k行为羊的坐标,pi,pj,和xi,yi范围一样但是不会在顶点上,严格在牧场内。
Output
输出:牧场能划分的总方案数被m除的余数。
Sample Input
5 5
3 0
-1 -1
-3 4
1 10
1 0
-1 0
1 6
-2 5
Sample Output

题解:先枚举每个点,将所有羊按关于这个点的极角排序,然后用扫描线扫一遍所有的羊和顶点,即可知道这个点可以和那些点连线使得连线的左右两边的羊数都是偶数。这样我们就得到了所有合法的线段。
然后考虑DP,用f[i][j]表示在从i顺时针到j的这些点中三角剖分的方案数。转移时我们枚举i-j这条边和哪个点相连形成三角形,即:
$f[i][j]=\sum\limits_{k\in(i..j)}f[i][k]\times f[k][j] (i-k和k-j的线段都合法)$
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,P;
int f[610][610];
bool ok[610][610];
struct point
{
int x,y;
point() {}
point(int A,int B) {x=A,y=B;}
point operator - (const point &a) const {return point(x-a.x,y-a.y);}
int operator * (const point &a) const {return x*a.y-y*a.x;}
}p[610],q[20010],now;
inline int I(int x) {return (x==n)?1:x+1;}
bool cmp(const point &a,const point &b)
{
return (a-now)*(b-a)<0;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),P=rd();
int i,j,k,len;
for(i=1;i<=n;i++) p[i].x=rd(),p[i].y=rd();
for(i=1;i<=m;i++) q[i].x=rd(),q[i].y=rd();
now=p[1];
sort(p+2,p+n+1,cmp);
for(i=1;i<=n;i++)
{
now=p[i];
sort(q+1,q+m+1,cmp);
for(k=1,j=I(i);j!=i;j=I(j))
{
for(;k<=m&&(p[j]-now)*(q[k]-p[j])>0;k++);
if((k&1)&&!(k<=m&&(p[j]-now)*(q[k]-p[j])==0)) ok[i][j]=1;
}
}
for(i=1;i<=n;i++) f[i][I(i)]=1;
for(len=2;len<n;len++) for(i=1;i<=n;i++)
{
j=i+len;
if(j>n) j-=n;
for(k=I(i);k!=j;k=I(k)) if(ok[i][k]&&ok[k][j]) f[i][j]=(f[i][j]+f[i][k]*f[k][j])%P;
}
printf("%d",f[1][n]);
return 0;
}
【BZOJ2087】[Poi2010]Sheep 几何+DP的更多相关文章
- BZOJ2087 : [Poi2010]Sheep
一条边能连上当且仅当它没有经过任何点,并且两边的点都是偶数个. 枚举原点,通过极角排序求出哪些边是合法的,然后区间DP即可. 时间复杂度$O(nm\log m+n^3)$. #include<c ...
- bzoj 2087: [Poi2010]Sheep【凸包+极角排序+dp】
首先处理处理出来哪些边能连--能把羊分成两个偶数部分的,实现是在凸包上枚举极点,极角排序,枚举凸包上点对判断两边羊的个数的奇偶即可,设可以连边为v[i][j]=1 然后设f[i][j]为从i到j个凸包 ...
- Game of Taking Stones && POJ1259 /// 最大空凸包 几何+DP
题目大意: 给定n个点 求出这n个点中最大空凸包的面积 只放个模板 一份模板过两题(滑稽 这个讲解够详细了 https://blog.csdn.net/nyroro/article/details/4 ...
- hdu----(1599)最大子矩阵(几何/dp)
最大子矩阵 Time Limit: 30000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- POI2010题解
POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- bzoj2091: [Poi2010]The Minima Game DP
2091: [Poi2010]The Minima Game DP 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2091 思路 这类问题好迷 ...
- BZOJ 1719--[Usaco2006 Jan] Roping the Field 麦田巨画(几何&区间dp)
1719: [Usaco2006 Jan] Roping the Field 麦田巨画 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 82 Solved ...
- BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】
BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...
随机推荐
- RRD.so文件 rrdruby
ubuntu 12.04绑定rrdruby gem install librrd 用来装rrdruby,这样才能找到RRD.so文件然后在rb文件中加入这两句话: $: << '/path ...
- Unix 系统下的 Nginx 1.4.x
Unix 系统下的 Nginx 1.4.x 本文档包括使用 PHP-FPM 为 Nginx 1.4.x HTTP 服务器安装和配置 PHP 的说明和提示. 本指南假定您已经从源代码成功构建 Nginx ...
- Qt中的串口编程之一
QtSerialPort 简介 功能介绍 SerialPort SerialPortInfo 源代码 编译和安装 配置编译环境 Perl只是在Qt5的时候才需要Qt4的情况下可以不配置 使用如下推荐步 ...
- 总结一发linux常用命令
显示目录和文件的命令 Ls:用于查看所有文件夹的命令. Dir:用于显示指定文件夹和目录的命令 Tree: 以树状图列出目录内容 Du:显示目录或文件大小 修改目录,文件权限和属主及数组命令 Ch ...
- thinkphp 操作mssql2008
配置文件 <?php return array( //'配置项'=>'配置值' //'USERNAME'=>'admin', //赋值 //数据库配置信息 'DB_TYPE' =&g ...
- C++ 判断
C++ 判断判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). #include <iostream> /* ru ...
- h264 i p 帧特点
1.爱无铭(47530789) 2014-2-13 17:07:27 I帧只有intra p帧有inter和intra:B帧一般只用inter 2. 庐舍闲士(361389535) 2014-2 ...
- 【Java面试题】17 如何把一个逗号分隔的字符串转换为数组? 关于String类中split方法的使用,超级详细!!!
split 方法:将一个字符串分割为子字符串,然后将结果作为字符串数组返回. stringObj.split([separator],[limit])参数:stringObj 必选项.要被分解的 ...
- Kubernetes(二)架构及资源关系简单总结
Kubernetes架构 先引用一下官方的架构图: 对于本文来说,我觉得这张图有点复杂了,但是我又懒得自己画了,就用这张吧.Kubernetes是一个集群,和传统的集群相似,它也是有一个主节点和若干个 ...
- CentOS6.8安装mysql并设置字符集编码
一.安装: 1. 首先以root用户进入系统 2. 输入命令: yum install mysql mysql-server -y 等待安装完成. 3. 启动MySQL,输入命令: /etc/init ...