Roping the Field

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 858   Accepted: 250

Description

Farmer John is quite the nature artist: he often constructs large works of art on his farm. Today, FJ wants to construct a giant "field web". FJ's field is large convex polygon with fences along the boundary and fence posts at each of the N corners (1 <= N <= 150). To construct his field web, FJ wants to run as many ropes as possible in straight lines between pairs of non-adjacent fence posts such that no two ropes cross. 

There is one complication: FJ's field is not completely usable. Some evil aliens have created a total of G (0 <= G <= 100) grain circles in the field, all of radius R (1 <= R <= 100,000). FJ is afraid to upset the aliens, and therefore doesn't want the ropes to pass through, or even touch the very edge of a grain circle. Note that although the centers of all the circles are contained within the field, a wide radius may make it extend outside of the field, and both fences and fence posts may be within a grain circle. 

Given the locations of the fence posts and the centers of the circles, determine the maximum number of ropes that FJ can use to create his field web. 

FJ's fence pots and the circle centers all have integer coordinates X and Y each of which is in the range 0..1,000,000.

Input

Line 1: Three space-separated integers: N, G, and R 

Lines 2..N+1: Each line contains two space-separated integers that are the X,Y position of a fence post on the boundary of FJ's field. 

Lines N+2..N+G+1: Each line contains two space-separated integers that are the X,Y position of a circle's center inside FJ's field.

Output

Line 1: A single integer that is the largest number of ropes FJ can use for his artistic creation.

Sample Input

5 3 1
6 10
10 7
9 1
2 0
0 3
2 2
5 6
8 3

Sample Output

1

Hint

Explanation of the sample: 

A pentagonal field, in which all possible ropes are blocked by three grain circles, except for the rope between fenceposts 2 and 4.

题意:

在一平面上,按顺序给定 n 个点(事实上给出的点可以按顺逆时针围成一个闭合的多边形),m 个半径为 r 的圆。要给 n 个点两两连线,要求最多能连多少条线;
连线限制:
  1. 连线不能穿过任意一个圆,也不能与圆相切;
  2. 连线不能在中途相交,同一个点可以连多条线;
  3. 相邻的两个点不能连线(第一个点和第 n 个点是相邻的)。

思路:

首先在不考虑相交的情况下预处理出哪两个点可以连线,然后dp;

dp[i][j] 表示第 i 个点到第 j 个点最多可连多少条线,dp[i][j] = max(dp[i][k] + dp[k][j] + cnc[i][j], dp[i][j]);

其中 i < k < j;cnc[i][j] 表示 i , j 能否连线,能则为1,否则为0;

代码:

#include<map>
#include<set>
#include<list>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<cctype>
#include<cfloat>
#include<cstdio>
#include<memory>
#include<string>
#include<vector>
#include<cassert>
#include<csignal>
#include<cstdlib>
#include<cstring>
#include<numeric>
#include<utility>
#include<iostream>
#include<algorithm>
#include<functional>
#define LL long long
#define PB push_back
#define MAXN 171
#define RPT(I,L,R) for(int I=L;I<R;++I)
#define TPR(I,R,L) for(int I=R;I>=L;--I)
using namespace std;
template<class T> bool Umx(T &A,const T &B)
{
return B>A?A=B,1:0;
}
template<class T> bool Umn(T &A,const T &B)
{
return B<A?A=B,1:0;
}
const int inf=~0u>>2; int n,m,i,j,k;
LL r;
bool cnc[MAXN][MAXN];
int f[MAXN][MAXN]; struct point
{
LL x,y;
bool operator < (const point &T) const
{
return this->y<T.y || (this->y==T.y && this->x<T.x);
}
void read()
{
scanf("%I64d%I64d",&x,&y);
}
} p[MAXN],c[MAXN]; inline LL sqr(LL X)
{
return X*X;
}
inline LL dot(point A,point B,point O)
{
return (A.x-O.x)*(B.x-O.x)+(A.y-O.y)*(B.y-O.y);
}
inline LL cross(point A,point B)
{
return A.x*B.y-B.x*A.y;
}
inline LL cross(point A,point B,point O)
{
return (A.x-O.x)*(B.y-O.y)-(B.x-O.x)*(A.y-O.y);
}
inline LL dist2(point A,point B)
{
return sqr(A.x-B.x)+sqr(A.y-B.y);
} struct cmp
{
point O;
cmp(const point &OO):O(OO) {}
bool operator()(const point &A,const point &B)
{
return cross(A,B,O)>0;
}
}; void init()
{
memset(f,-1,sizeof f);
scanf("%d%d%d",&n,&m,&r);
RPT(i,0,n) p[i].read();
RPT(i,0,m) c[i].read();
sort(p,p+n);
sort(p+1,p+n,cmp(p[0]));
} bool CrsCcl(point A,point B,point O)
{
if (sqr(r)>=min(dist2(O,A),dist2(O,B))) return true;
if (dot(B,O,A)<0ll || dot(A,O,B)<0ll) return false;
return (double)r*r*dist2(A,B)>=(double)cross(A,B,O)*cross(A,B,O);
} void Deal_Cnc()
{
memset(cnc,false,sizeof cnc);
RPT(i,0,n)
RPT(j,i+2,n)
if (!(i==0 && j==n-1))
{
cnc[i][j]=cnc[j][i]=true;
RPT(k,0,n)
if (CrsCcl(p[i],p[j],c[k]))
{
cnc[i][j]=cnc[j][i]=false;
break;
}
}
} int DP(int L,int R)
{
if (f[L][R]>0) return f[L][R];
if (R-L<2) return f[L][R]=0;
else if (R-L==2) return cnc[L][R];
int res=0;
RPT(i,L+1,R) Umx(res,DP(L,i)+DP(i,R));
return f[L][R]=res+cnc[L][R];
} int main()
{
init();
Deal_Cnc();
printf("%d\n",DP(0,n-1));
return 0;
}

poj3178 Roping the Field (计算几何 + dp)的更多相关文章

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

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

  2. sdut 2153:Clockwise(第一届山东省省赛原题,计算几何+DP)

    Clockwise Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Saya have a long necklace with ...

  3. POJ3178 计算几何+DP

    //一些点一些圆,过圆不能连线,相邻点不能连线,问最多连几条线 //计算几何模板+区间dp //关键是判断圆和线段是否相交 #include <cstdio> #include <c ...

  4. 『HGOI 20190917』Cruise 题解 (计算几何+DP)

    题目概述 在平面直角坐标系的第$1$象限和第$4$象限有$n$个点,其中第$i$个点的坐标为$(x_i,y_i)$,有一个权值$p_i$ 从原点$O(0,0)$出发,不重复的经过一些点,最终走到原点, ...

  5. HDU 4562 守护雅典娜 (计算几何+DP)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...

  6. Code Chef MINPOLY(计算几何+dp)

    题面 传送门 题解 我们枚举这个凸多边形\(y\)坐标最小的点\(p_i\),然后对于所有\(y\)坐标大于等于它的点极角排序 我们预处理出\(s_{j,k}\)表示三角形\(p_i,p_j,p_k\ ...

  7. bzoj 3778: 共鸣【计算几何+dp】

    枚举起点,然后设f[i][j]为上凸壳上一个点是i当前点是j的最大面积,g是下凸壳,然后合并的时候枚举结束点t合并上下凸壳即可 这样的好处是每次转移都是往凸多边形里加一个三角形(s,i,j),所以判断 ...

  8. POJ 3254 Corn Fields:网格密铺类 状压dp

    题目链接:http://poj.org/problem?id=3254 题意: 给你一片n*m的耕地,你可以在上面种玉米.但是其中有一些地方是荒芜的,不能种植.并且种植玉米的地方不能相邻.问你在这片地 ...

  9. hdu 1081 dp问题:最大子矩阵和

    题目链接 题意:给你一个n*n矩阵,求这个矩阵的最大子矩阵和 #include<iostream> #include<cstdio> #include<string.h& ...

随机推荐

  1. k8s service对象

    k8s service对象   概述 service服务也是Kubernetes里核心字眼对象之一,Kubernetes里的每一个service其实就是我们经常提起的微服务架构中的一个微服务,之前讲解 ...

  2. 前端直传文件到aliyun OSS

    <template> <div id="container"> <div class="img-item m-1 upload-file&q ...

  3. TS数据类型:类型别名/联合类型/字面量类型/类型推论等纲要

    在学C/C++  Java等强类型语言时,变量类型是唯一的,需要先指定.PHP JavaScript等弱类型语言时,无需指定变量类型 但是,TypeScript里面的联合类型 (Union Type) ...

  4. 使用vue-cli(vue脚手架)快速搭建项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目.这篇文章将会从实操的角度,介绍整个搭建的过程. 1. 避坑前言 其实这次使用vue-cli的 ...

  5. 在 Kubernetes 上部署 OpenStack 是什么体验

    红蓝出 CP,OpenStack 和 Kubernetes 在一起会怎样? 背景 从去年开始就想深入地学习 Kubernetes,首先想到是在 OpenStack 上能比较轻松地玩转,所以去 尝试了 ...

  6. Python-序列常用方法 + * += extend append方法区别

    + 两边都是相同序列类型.拼接成一个新的序列 print((1, 2, 3) + (4, 6)) print("beimenchuixue" + "ximenchuife ...

  7. Centos-跟踪数据传输路由状态-traceroute

    traceroute 显示网卡数据包传输到指定主机的路径信息,追踪数据传输路由状况,默认数据包大小38字节 相关选项 -i   使用指定网络接口发送数据 -n 使用IP而不使用主机名 -v 显示命令的 ...

  8. Centos-本机网络连接、运行端口和路由表等信息-netstat

    netstat 网络状态,显示本机网络连接.运行端口和路由表等信息 相关选项 -a 显示本机所有连接和监听端口 -n 以网络IP地址形式显示当前建立的有效连接和端口 -r 显示路由表信息 -t 显示T ...

  9. 给子元素设置margin-top无效果的一种解决方法

    在写一个登陆界面的时候,设置登录按钮的margin-top时出了问题 先是这么写的 <div style="margin-top:30px"> <a style= ...

  10. Office远程代码执行漏洞(CVE-2017-11882)

    POC: https://github.com/Ridter/CVE-2017-11882/ 一.简单的生成弹计算器的doc文件. 网上看到的改进过的POC,我们直接拿来用,命令如下: #python ...