[hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法
今天hdu的比赛的第一题,凸包+区间dp。
给出n个点m个圆,n<400,m<100,要求找出凸包然后给凸包上的点连线,连线的两个点不能(在凸包上)相邻,连线不能与圆相交或相切,连线不能相交但是可以有公共端点。
首先找出凸包,然后把n*n条边和m个圆算点到直线距离验证一下边是否与圆相交存到e[n][n]里。
然后显然是一个dp,但是我开始看错题目了以为不能有公共端点,能有公共端点的情况考虑一下像一个找三角形的过程,就是区间dp。
区间dp有一点妙的地方是最大区间范围是凸包点数而不用+1,因为连线的两个点不能在凸包上相邻所以这样就能直接得到最大值。
今天疯狂坑队友了,我要是帮着队友查错就能多对一道题了,因为自己菜没有写出来题还连累队友真的真的很抱歉。
代码在下面,也算是复习dp和码一个找凸包板子,这个方法好像叫graham扫描法?
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<stack>
#include<queue>
using namespace std;
const int maxn=;
int n,m,cnt;
int tot;
double r;
struct nod{
double x,y;
}poi[maxn],po[maxn*],ci[maxn];
bool e[maxn][maxn]={};
int f[maxn*][maxn*]={};
bool cmp(nod a,nod b){
double aa=atan2(a.y-po[].y,a.x-po[].x);
double bb=atan2(b.y-po[].y,b.x-po[].x);
if(aa==bb) return a.x<b.x;
return aa<bb;
}
double cro(nod a,nod b,nod c){
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
void getpo(){
int t=;
for( int i=; i<=n; ++i) {
if( poi[i].y < poi[t].y||( poi[i].y == poi[t].y&&poi[i].x < poi[t].x) ) t=i;
}
po[++cnt]=poi[t];swap(poi[t],poi[]);
sort(poi+,poi+n+,cmp);
po[++cnt]=poi[];
for(int i=;i<=n;++i){
//cout<<poi[i].x<<poi[i].y<<endl;
while(cnt>&&cro(po[cnt-],poi[i],po[cnt])>=)--cnt;
po[++cnt]=poi[i];
}
}
int main(){
int T;scanf("%d",&T);
while(T--){
tot=;
cnt=;
memset(e,,sizeof(e));
memset(f,,sizeof(f));
scanf("%d%d%lf",&n,&m,&r);
for( int i=; i<=n; ++i) scanf("%lf%lf",&poi[i].x,&poi[i].y);
for( int i=; i<=m; ++i) scanf("%lf%lf",&ci[i].x,&ci[i].y);
getpo();//cout<<1111111<<endl;
for(int i=;i<=cnt;++i){
// cout<<po[i].x<<po[i].y<<endl;
for(int j=i+;j<=cnt;++j){
if(i==&&j==cnt)continue;
double a=po[i].y-po[j].y,b=po[j].x-po[i].x;
double c=-(a*po[i].x+b*po[i].y);
e[i][j]=;
e[j][i]=;
for(int w=;w<=m;++w){
double ju=a*ci[w].x+b*ci[w].y+c;
if(ju<)ju=-ju;
ju/=sqrt(a*a+b*b);
if(ju>r)continue;
e[i][j]=;
e[j][i]=;
}
//cout<<i<<j<<e[i][j]<<endl;
}
}
int ans=;
for(int k=;k<=cnt;++k){
for(int i=,j=k;j<cnt*;++i,++j){
for(int t=i;t<=j;++t){
f[i][j]=max(f[i][j],f[i][t]);
if(e[(t-)%cnt+][(j-)%cnt+])f[i][j]=max(f[i][j],f[i][t]+);
}
}
}
for(int i=;i<=cnt;++i)ans=max(ans,f[i][i+cnt-]);
printf("%d\n",ans);
}
return ;
}
[hdu contest 2019-07-29] Azshara's deep sea 计算几何 动态规划 区间dp 凸包 graham扫描法的更多相关文章
- HDU 5928 DP 凸包graham
给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...
- [2019HDU多校第三场][HDU 6603][A. Azshara's deep sea]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6603 题目大意:给出一个凸包,凸包内有若干个圆,要求画尽可能多的对角线使得他们两两不在凸包内相交且不与 ...
- HDU 6603 Azshara's deep sea(凸包+区间DP)
由于题目要求,首先维护出一个凸包,然后在凸包上寻找点对关系,用rel[i][j]表示i点和j点之间是否可以连线,又由于维护出来的凸包上的点的个数不多,可以直接枚举点对并枚举所有圆,判断两点直线和圆是否 ...
- 【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)
Description: p<=10且p是质数,n<=7,l,r<=1e18 题解: Lucas定理: \(C_{n}^m=C_{n~mod~p}^{m~mod~p}*C_{n/p} ...
- Hdu OJ 5115 Dire Wolf (2014ACM/ICPC亚洲区北京站) (动态规划-区间dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:前面有n头狼并列排成一排, 每一头狼都有两个属性--基础攻击力和buff加成, 每一头 ...
- 【AtCoder】Tenka1 Programmer Contest 2019
Tenka1 Programmer Contest 2019 C - Stones 题面大意:有一个01序列,改变一个位置上的值花费1,问变成没有0在1右边的序列花费最少多少 直接枚举前i个都变成0即 ...
- 07/29/2013 02:10:02 AM - CMDPHP: Poller[0] Host[6] DS[10] WARNING: Result from SNMP not valid. Partial Result: U
snmpwalk -c public -v2c 客户端ip地址 自定义的oid 能取到数据,但是服务器端就是图片一片空白 rrdtool fetch 文件名.rrd 查看到的全都是nan cac ...
- Alpha冲刺(6/10)——2019.4.29
所属课程 软件工程1916|W(福州大学) 作业要求 Alpha冲刺(6/10)--2019.4.29 团队名称 待就业六人组 1.团队信息 团队名称:待就业六人组 团队描述:同舟共济扬帆起,乘风破浪 ...
- agentzh 的 Nginx 教程(版本 2019.07.31)
agentzh 的 Nginx 教程(版本 2019.07.31) agentzh 的 Nginx 教程(版本 2019.07.31) https://openresty.org/download/a ...
随机推荐
- Mybatis @Result注解的使用案例
@Result注解的使用
- ByteArray、16进制、字符串之间的转换
ByteArray.16进制.字符串之间的转换: package fengzi.convert { import flash.utils.ByteArray; public class ByteArr ...
- go 计算文件行
package main import ( "bufio" "fmt" "os" ) func main() { //判断命令行参数,小于两 ...
- k8s yaml格式的pod定义文件完整内容
apiVersion: v1 #必选,版本号,例如v1,版本号必须可以用 kubectl api-versions 查询到 . kind: Pod #必选,Pod metadata: #必选,元数据 ...
- WPF 程序如何跨窗口/跨进程设置控件焦点
原文:WPF 程序如何跨窗口/跨进程设置控件焦点 WPF 程序提供了 Focus 方法和 TraversalRequest 来在 WPF 焦点范围内转移焦点.但如果 WPF 窗口中嵌入了其他框架的 U ...
- SpringCloud--1--服务治理Eureka
一.Eureka概述 1.Eureka特点 只需通过简单引入依赖和注解配置,就能让SpringBoot构建的微服务应用轻松地与Eureka服务治理体系进行整合. Eureka负责服务治理,即:微服务实 ...
- .net core使用ocelot---第四篇 限流熔断
简介 .net core使用ocelot---第一篇 简单使用 .net core使用ocelot---第二篇 身份验证 .net core使用ocelot---第三篇 日志记录 前几篇文章我们陆续介 ...
- Oracle 检索数据(查询数据、select语句)
用户对表或视图最常进行的操作就是检索数据,检索数据可以通过 select 语句来实现,该语句由多个子句组成,通过这些子句完成筛选.投影和连接等各种数据操作,最终得到想要的结果. 语法: select ...
- 如何导出ane所需的swc
来源:http://blog.sina.com.cn/s/blog_6471e1bb01012ard.html 打包.ane文件的时候需要用到ActionScript的扩展库(swc文件),那么如何生 ...
- Python——函数&作用域
我们前面学的都是面向过程式的编程(代码从上到下写,并运行),而函数式编程是将繁杂的代码通过整理特性进行规整.像图书馆一样,将小说.教学.外文等书籍进行分类.让编程人员或看代码人员很容易的查看该段代码的 ...