【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 4 10
5 5
3 0
-1 -1
-3 4
1 10
1 0
-1 0
1 6
-2 5

Sample Output

3

题解:先枚举每个点,将所有羊按关于这个点的极角排序,然后用扫描线扫一遍所有的羊和顶点,即可知道这个点可以和那些点连线使得连线的左右两边的羊数都是偶数。这样我们就得到了所有合法的线段。

然后考虑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的线段都合法)$

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <algorithm>
  5. using namespace std;
  6. int n,m,P;
  7. int f[610][610];
  8. bool ok[610][610];
  9. struct point
  10. {
  11. int x,y;
  12. point() {}
  13. point(int A,int B) {x=A,y=B;}
  14. point operator - (const point &a) const {return point(x-a.x,y-a.y);}
  15. int operator * (const point &a) const {return x*a.y-y*a.x;}
  16. }p[610],q[20010],now;
  17. inline int I(int x) {return (x==n)?1:x+1;}
  18. bool cmp(const point &a,const point &b)
  19. {
  20. return (a-now)*(b-a)<0;
  21. }
  22. inline int rd()
  23. {
  24. int ret=0,f=1; char gc=getchar();
  25. while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
  26. while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
  27. return ret*f;
  28. }
  29. int main()
  30. {
  31. n=rd(),m=rd(),P=rd();
  32. int i,j,k,len;
  33. for(i=1;i<=n;i++) p[i].x=rd(),p[i].y=rd();
  34. for(i=1;i<=m;i++) q[i].x=rd(),q[i].y=rd();
  35. now=p[1];
  36. sort(p+2,p+n+1,cmp);
  37. for(i=1;i<=n;i++)
  38. {
  39. now=p[i];
  40. sort(q+1,q+m+1,cmp);
  41. for(k=1,j=I(i);j!=i;j=I(j))
  42. {
  43. for(;k<=m&&(p[j]-now)*(q[k]-p[j])>0;k++);
  44. if((k&1)&&!(k<=m&&(p[j]-now)*(q[k]-p[j])==0)) ok[i][j]=1;
  45. }
  46. }
  47. for(i=1;i<=n;i++) f[i][I(i)]=1;
  48. for(len=2;len<n;len++) for(i=1;i<=n;i++)
  49. {
  50. j=i+len;
  51. if(j>n) j-=n;
  52. 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;
  53. }
  54. printf("%d",f[1][n]);
  55. return 0;
  56. }
 

【BZOJ2087】[Poi2010]Sheep 几何+DP的更多相关文章

  1. BZOJ2087 : [Poi2010]Sheep

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

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

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

  3. Game of Taking Stones && POJ1259 /// 最大空凸包 几何+DP

    题目大意: 给定n个点 求出这n个点中最大空凸包的面积 只放个模板 一份模板过两题(滑稽 这个讲解够详细了 https://blog.csdn.net/nyroro/article/details/4 ...

  4. hdu----(1599)最大子矩阵(几何/dp)

    最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  5. POI2010题解

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

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. bzoj2091: [Poi2010]The Minima Game DP

    2091: [Poi2010]The Minima Game DP 链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2091 思路 这类问题好迷 ...

  8. BZOJ 1719--[Usaco2006 Jan] Roping the Field 麦田巨画(几何&区间dp)

    1719: [Usaco2006 Jan] Roping the Field 麦田巨画 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 82  Solved ...

  9. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

随机推荐

  1. powerdesigner与mysql数据库的连接

    (1).在桌面新建一个mysql.dpc文件,里面可以什么内容也没有. (2).打开powerdesigner,操作如下: (3).把mysql.dcp文件选中: (4).建立连接属性: (5).测试 ...

  2. 一个残酷的生鲜O2O之梦

    三个年轻人,毕业一年,上海浦东张江开了一家生态有机蔬菜店-稻香麦甜. 首先,这不是一个关于成功励志的故事,相反的,我们走向了悬崖.经营2个月,最终以签字转让结束了实体店. 准备阶段 我,首先辞职,那时 ...

  3. Android修改默认SharedPreferences文件的路径,SharedPreferences常用工具类

    import android.app.Activity; import android.content.Context; import android.content.ContextWrapper; ...

  4. struts 标签 牛逼之处

    <s:hidden>标签的value属性的类型是String类型,所以把<s:property value="#session.LOGIN_USER"/>当 ...

  5. 74hc165三片级联

    3片74HC165进行级联,用于扩展IO口,读取外界设备的数据. unsigned int read_74165(void) { unsigned ; unsigned ; //三片74hc165,需 ...

  6. (转)MFC鼠标单击消息拦截双击消息

    如果LButtonDown和LButtonDblClk同时有实现的话 总会实现单击消息,在网上找解决方法,思想是在单击消息实现中取时间,计算两次单击事件的时间差 来回尝试修改,最后成这个样子,还算简单 ...

  7. jquery -- onchange

    触发onchange 首先页面有一个input标签,并且已绑定onchange事件,如: 1 <input type="text" onchange="consol ...

  8. PHP大量数据循环时内存耗尽问题的解决方案

    最近在开发一个PHP程序时遇到了下面的错误:PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted错误信息显...分析: ...

  9. Hibernate学习(2):添加demo

  10. SharePoint 2013 一次性上传文件大小限制

    默认是250MB,最大一次上传文件不超过2G The defaut size is 250MB and maximun upload size is 2047MB. It's can't greate ...