题目链接: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. Webpack配置开发环境总结

    本文主要讲解webpack.config.js文件的配置,不会讲解webpack是什么,默认你会安装webpack及其它npm包,并对webpack有一些了解. 下面将从webpack.config. ...

  2. DB2输出每隔10分钟的数据

    一.输出1-100的数据 此处参考 https://bbs.csdn.net/topics/390516027 with t(id) as ( as id from sysibm.sysdummy1 ...

  3. Redis 常用命令学四:集合类型命令

    1.增加和删除命令 127.0.0.1:6379> SADD st a (integer) 1 127.0.0.1:6379> SADD st r f g (integer) 3 127. ...

  4. python对影评进行评论分析,形成词云图

    1 # -*- coding:utf-8 -*-   2 '''   3 抓取豆瓣电影某部电影的评论  4抓取电影   5 网址链接:https://movie.douban.com/subject/ ...

  5. T100——错误信息提示传入参数显示

    LET l_str1 = l_xccc.xccc901LET l_str2 = l_inat015LET l_str = l_str1.trim(),'|',l_str2.trim() CALL cl ...

  6. phc-winner-argon2、argon2-cffi安装使用方法

    Argon2 is a password-hashing function created by by Alex Biryukov, Daniel Dinu, and Dmitry Khovratov ...

  7. sessionId详解

    sessionid是一个会话的key,浏览器第一次访问服务器会在服务器端生成一个session,有一个sessionid和它对应.服务端在创建了Session的同时,会为该Session生成唯一的se ...

  8. C# Winform 设置窗口打开的特效

    https://www.cnblogs.com/mq0036/p/6421946.html using System.Runtime.InteropServices; public class Win ...

  9. 在.netcore webapi项目中使用后台任务工具Hangfire

    安装Hangfire 在webapi项目中通过nuget安装Hangfire.Core,Hangfire.SqlServer,Hangfire.AspNetCore,截止到目前的最新版本是1.7.6. ...

  10. xcode 更改svn地址

    xcode如何更改svn地址: 1在控制台 cd进入到项目路径下 命令提示符下输入 $svn info 查看svn信息 修改svn地址 输入如下命令 $svn switch --relocate ht ...