题目

不难猜到或者发现的性质,如果连了一条对角线划分出了奇数个点,那么这条对角线肯定不合法;因为划分成三角形就不可能有对角线相交,于是划分成奇数的那一边怎么样也不可能划分成全是偶数

于是我们需要对每一条对角线求,有多少条个点在它上面,直接暴力枚举对角线用叉积来判是\(O(n^2m)\)的,显然过不去的样子;不难发现这个问题具有一定的单调性,对于一个点\(i\),求凸包上其他点\(j\)和\(i\)所连对角线的划分情况,我们可以顺时针枚举点\(j\),不难发现如果一个点在\((i,j-1)\)这条边以上,那么也肯定在\((i,j)\)以上,于是我们以点\(i\)为原点跑一边奇角排序,之后开个指针扫一扫就好了

之后求方案数就比较简单了,这是一个凸多边形的弦划分问题,可以大力区间\(dp\)

设\(g_{l,r}\)表示区间\([l,r]\)的合法划分数

那么就有\(g_{l,r}=\sum_{i=l+1}^{r-1}[f_{l,i}=1][f_{i,r}=1]g_{l,i}\times g_{i,r}\)

\(f_{l,i}=1\)表示这条对角线合法

复杂度是\(O(nm\log m+n^3)\),代码

#include<bits/stdc++.h>
#define vt pt
#define re register
inline int read() {
char c=getchar();int x=0,r=1;while(c<'0'||c>'9') {if(c=='-') r=-1;c=getchar();}
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x*r;
}
const int maxn=603;
struct pt {int x,y;}a[maxn],b[200005];
int n,m,mod,nw;
int f[maxn][maxn],g[maxn][maxn],vis[maxn][maxn];
inline int qm(int x) {return x>=mod?x-mod:x;}
inline int crs(pt A,pt B) {return A.x*B.y-A.y*B.x;}
inline vt operator-(const pt A,const pt B) {return (vt){A.x-B.x,A.y-B.y};}
inline int cmp(const vt A,const vt B) {return crs(A-a[nw],B-a[nw])<0;}
int dfs(int l,int r) {
if(vis[l][r]) return g[l][r];
vis[l][r]=1;
for(re int i=l+1;i<r;i++)
if(!(f[l][i]|f[i][r])) g[l][r]=qm(g[l][r]+dfs(l,i)*dfs(i,r)%mod);
return g[l][r];
}
int main() {
n=read(),m=read(),mod=read();
for(re int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
for(re int i=1;i<=m;i++) b[i].x=read(),b[i].y=read();
for(re int i=1;i<=n;i++) {
nw=i;std::sort(b+1,b+m+1,cmp);int tot=0;
for(re int j=i+1;j<=n;j++) {
while(tot<m&&crs(a[j]-a[i],b[tot+1]-a[i])>=0) ++tot;
f[i][j]=f[j][i]=(tot&1);
if(tot&&crs(a[j]-a[i],b[tot]-a[i])==0) f[i][j]=f[j][i]=1;
}
}
for(re int i=1;i<n;i++) g[i][i+1]=1,vis[i][i+1]=1;
printf("%d\n",dfs(1,n));
return 0;
}

[POI2010]OWC-Sheep的更多相关文章

  1. 【BZOJ2087】[Poi2010]Sheep 几何+DP

    [BZOJ2087][Poi2010]Sheep Description Lyx的QQ牧场养了很多偶数个的羊,他是Vip,所以牧场是凸多边形(畸形).现在因为他开挂,受到了惩罚,系统要求他把牧场全部分 ...

  2. BZOJ2087 : [Poi2010]Sheep

    一条边能连上当且仅当它没有经过任何点,并且两边的点都是偶数个. 枚举原点,通过极角排序求出哪些边是合法的,然后区间DP即可. 时间复杂度$O(nm\log m+n^3)$. #include<c ...

  3. bzoj 2087: [Poi2010]Sheep【凸包+极角排序+dp】

    首先处理处理出来哪些边能连--能把羊分成两个偶数部分的,实现是在凸包上枚举极点,极角排序,枚举凸包上点对判断两边羊的个数的奇偶即可,设可以连边为v[i][j]=1 然后设f[i][j]为从i到j个凸包 ...

  4. POI2010题解

    POI2010题解 我也不知道我为什么就开始刷POI了 有些题目咕掉了所以不完整(我都不知道POI到底有多少题) [BZOJ2079][Poi2010]Guilds (貌似bz跟洛谷上的不是一个题?) ...

  5. BZOJ 2080: [Poi2010]Railway 双栈排序

    2080: [Poi2010]Railway Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 140  Solved: 35[Submit][Statu ...

  6. 2001. Counting Sheep

      After a long night of coding, Charles Pearson Peterson is having trouble sleeping. This is not onl ...

  7. hdu 3046 Pleasant sheep and big big wolf 最小割

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3046 In ZJNU, there is a well-known prairie. And it a ...

  8. 【BZOJ】【2084】【POI2010】Antisymmetry

    Manacher算法 啊……Manacher修改一下就好啦~蛮水的…… Manacher原本是找首尾相同的子串,即回文串,我们这里是要找对应位置不同的“反回文串”(反对称?233) 长度为奇数的肯定不 ...

  9. BZOJ2086: [Poi2010]Blocks

    题解: 想了想发现只需要求出最长的一段平均值>k即可. 平均值的问题给每个数减去k,判断是否连续的一段>0即可. 然后我们发现如果i<j 且 s[i]<s[j],那么 j 对于 ...

  10. 【DFS深搜初步】HDOJ-2952 Counting Sheep、NYOJ-27 水池数目

    [题目链接:HDOJ-2952] Counting Sheep Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 ...

随机推荐

  1. ssh 免密码登录实现批量处理

    搭建集群的时候ssh 免密码登录是一个问题以下脚本将实现批量处理 文件1主机名:host 17.19.18.11:12317.19.18.12:123 文件2:ssh_setup.py #!/usr/ ...

  2. inno setup静默安装

    [Code] //关键代码静默安装 procedure InitializeWizard(); begin   //不显示边框,这样就能达到不会闪两下了   WizardForm.BorderStyl ...

  3. C++中的函数重载分析(二)

    1,重载与指针: 1,下面的函数指针将保存哪个函数的地址? int func(int x) { return x; } int func(int a, int b) { return a + b; } ...

  4. java虚拟机规范(se8)——class文件格式(五)

    4.7.1 定义和命名新属性 允许编译器定义和发布的class文件在class文件结构体.field_info结构体.method_info结构体和Code结构体中的attributes表中包含新的属 ...

  5. 42.Flatten Binary Tree to Linked List

    Level:   Medium 题目描述: Given a binary tree, flatten it to a linked list in-place. For example, given ...

  6. C#@字符的使用

    一,在字符串中的使用 //当在字符串前面加上一个@字符的时候,我们就可以把一个字符串定义在多行 // 编译器不会再去识别字符串中的转义字符 // 如果需要在字符串中表示一个双引号的话,需要使用两个双引 ...

  7. BUUCTF CRYPTO部分题目wp

    对密码学了解不多,做一下熟悉熟悉 1,看我回旋踢 给的密文synt{5pq1004q-86n5-46q8-o720-oro5on0417r1} 简单的凯撒密码,用http://www.zjslove. ...

  8. config maven in intellij IDEA

    Config maven in IDEA                 File ->Settings->Build,Execution.Deployment->build Too ...

  9. js常用算术运算符与一元运算符在做运算时不同类型的转换规则

    /** * 算术运算符:+, -, *, /, % * 当对非number类型的值进行运算(-, *, /, %)时,会将这些值先转换成number再运算,加法'+'运算除外, * 当对非number ...

  10. Bootstrap 小功能

    <div class="container"> <div class="navbar-header"> <button type= ...