题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6603

题目大意:给出一个凸包,凸包内有若干个圆,要求画尽可能多的对角线使得他们两两不在凸包内相交且不与任意一个圆有公共点

题解:先预处理出所有点对间的连线是否会和圆有公共点,记为x[i][j],之后进行区间DP。设f[i][d]表示从第\(i\)个点到\(i+d\)个点这个区间之内最多能画多少条对角线,那么就有\(f[i][d]=x[i][nxt]+max(f[i][d-1],f[i+1][d-1])\),答案取f[i][d]的最大值即可

   复杂度分析:求凸包\(O(nlogn)\),预处理\(O(n^2g)\),DP\(O(n^2)\),总时间复杂度为\(O(n^2g)\)

吐槽:本题题面又臭又长,严重影响观看体验

   给出的\(n\)个点不一定是凸包的顶点,所以要先求一次凸包,而且这么重要的条件居然是隐藏在巨大题面的一个小括号里的,坑了不少人

   最后3分钟才发现这个隐藏条件,赶紧拉了个模板出来最后各种调参数终于在最后一分钟爆过去了orz...

#include<bits/stdc++.h>
using namespace std;
#define N 401
#define LL long long
const double eps=1e-;
int sgn(double x)
{
if (x<-eps) return -;
if (x>eps) return ;
return ;
}
struct Point
{
double x,y;
void read(){scanf("%lf%lf",&x,&y);}
Point operator -(const Point &t)const{return {x-t.x,y-t.y};}
double operator *(const Point &t)const{return x*t.y-y*t.x;}
double length()const{return sqrt(x*x+y*y);}
double ang()const
{
return atan2(1.0*y,1.0*x);
}
}b[N];
Point cent;
bool cmpang(const Point &p1,const Point &p2)
{
int tmp=sgn( (p1-cent).ang() - (p2-cent).ang() );
if (tmp!=) return tmp<;
return (p1-cent).length() < (p2-cent).length();
}
struct POLYGON
{
int n;
Point a[N];
void ChangetoConvex()
{
for (int i=;i<=n;i++)
if (a[i].x<a[].x||a[i].x==a[].x&&a[i].y<a[].y)
swap(a[],a[i]);
cent=a[];
sort(a+,a+n+,cmpang);
int top=;
for (int i=;i<=n;i++)
{
while(top>=&&
(a[top]-a[top-])*(a[i]-a[top])<= )
top--;
a[++top]=a[i];
}
n=top;
}
}P;
int T,n,g,r,x[N][N],f[N][N];
bool check(int x,int y)
{
if(x%n+==y || y%n+==x)
return false;
double dis=(P.a[x]-P.a[y]).length();
for(int i=;i<=g;i++)
{
double cha=abs((P.a[y]-P.a[x])*(b[i]-P.a[x]));
if(cha+eps<=1.0*r*dis)return false;
}
return true;
}
void init()
{
int ans=;
memset(f,,sizeof(f));
scanf("%d%d%d",&n,&g,&r);
P.n=n;
for(int i=;i<=n;i++)
P.a[i].read();
for(int i=;i<=g;i++)
b[i].read();
P.ChangetoConvex();
n=P.n;
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++)
x[i][j]=x[j][i]=check(i,j);
for(int d=;d<=n-;d++)
for(int i=;i<=n;i++)
{
int nxt=(i+d-)%n+,res=;
res=max(f[i][d-],f[i%n+][d-]);
f[i][d]=x[i][nxt]+res;
ans=max(ans,f[i][d]);
}
printf("%d\n",ans);
}
int main()
{
scanf("%d",&T);
while(T--)init();
}

[2019HDU多校第三场][HDU 6603][A. Azshara's deep sea]的更多相关文章

  1. [2019HDU多校第五场][HDU 6626][C. geometric problem]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6626 题目大意:给出平面上六个点\(A,B,M,N,X,Y\)以及两条直线\(L1,L2\),要求在四 ...

  2. [2019HDU多校第四场][HDU 6617][D. Enveloping Convex]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6617 题目大意:给出一凸包\(P\),求最小的与\(P\)相似且对应边平行的多边形,使得题目给出的\( ...

  3. 2019Hdu多校第三场:1007 Find the answer(multiset 解法)

    原题链接: Find the answer c++中,multiset是库中一个非常有用的类型,它可以看成一个序列,插入一个数,删除一个数都能够在O(logn)的时间内完成,而且他能时刻保证序列中的数 ...

  4. 2019HDU多校第三场F Fansblog——威尔逊定理&&素数密度

    题意 给定一个整数 $P$($10^9 \leq p\leq 1^{14}$),设其前一个质数为 $Q$,求 $Q!  \ \% P$. 分析 暴力...说不定好的板子能过. 根据威尔逊定理,如果 $ ...

  5. 2019HDU多校第三场 K subsequence——最小费用最大流

    题意 给定一个 $n$ 个整数的数列,从中至多选取 $k$ 个上升子序列(一个元素最多被选一次),使得选取的元素和最大. 分析 考虑这个问题和经典网络流问题“最长不下降子序列”相似,我们考虑对这个建图 ...

  6. 2019HDU多校第三场 Distribution of books 二分 + DP

    题意:给你一个序列,你可以选择序列的一个前缀,把前缀分成k个连续的部分,要求这k个部分的区间和的最大值尽量的小,问这个最小的最大值是多少? 思路:首先看到最大值的最小值,容易想到二分.对于每个二分值m ...

  7. [hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法

    今天hdu的比赛的第一题,凸包+区间dp. 给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相 ...

  8. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  9. 牛客多校第三场 F Planting Trees

    牛客多校第三场 F Planting Trees 题意: 求矩阵内最大值减最小值大于k的最大子矩阵的面积 题解: 矩阵压缩的技巧 因为对于我们有用的信息只有这个矩阵内的最大值和最小值 所以我们可以将一 ...

随机推荐

  1. Redis(1.16)Redis监控为什么是单线程?为什么快?

    [1]Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了很多上下文切换线程的时间: 3.redis使用多路复用技术,可以处理并发的连接. ...

  2. c++语法笔记(中)

    继承与派生 继承面向对象程序设计4个主要特征:抽象,封装,继承,多态性c++通过继承实现可重用性.有时两个类的内容基本相同或有一部分相同,这时可以利用原来声明的类作为基础,再加上新的内容即可,减少了工 ...

  3. Can you answer these queries III

    Can you answer these queries III 题目:洛谷 SPOJ [题目描述] 给定长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“0 x y”,把A[x]改 ...

  4. linux awk和sed工具

    慕课网链接:https://www.imooc.com/video/14508 部分示例命令 #替换passwd中的用户名和userid和gid gsed 's/\(^[a-z_-]\+\):\*:\ ...

  5. Python中datetime库的用法

    datetime模块用于是date和time模块的合集,datetime有两个常量,MAXYEAR和MINYEAR,分别是9999和1. datetime模块定义了5个类,分别是 1.datetime ...

  6. diy操作系统 0:万事开头难

          许久之前就有写一个tiny的操作系统的打算,但时间和精力关系,想法一直没有成为最终的代码.操作系统的构建本身是个系统工程,门槛较高,需要多方面的知识,往往几行代码背后是厚厚的几本书才能说清 ...

  7. 【数据结构】Tournament Chart

    Tournament Chart 题目描述 In 21XX, an annual programming contest, Japan Algorithmist GrandPrix (JAG) has ...

  8. BZOJ4698 SDOI2008Sandy的卡片(后缀自动机)

    差分后即求多串LCS.先考虑两个串怎么做.对第一个串建SAM,第二个串在上面跑即可,任意时刻走到的节点表示的都是第二个串的当前前缀在第一个串中出现的最长的后缀,具体计算长度时每走一个字符长度+1,跳f ...

  9. Intellij IDEA集成JProfiler性能分析神器

    环境 JProfiler 17.1.3(IDEA插件) JProfiler 9.2(可执行软件) IntelliJ IDEA 2017.2.5 下载 下载JProfiler(IDEA)插件 方式1: ...

  10. 定时任务FluentScheduler

    1.Nuget 安装包 2.创建3个不同的任务 public class MyJob : IJob { void IJob.Execute() { Trace.WriteLine("现在时间 ...