首先将目标点按$y$坐标从小到大排序。

如果加速度为$0$,那么只要贪心走一遍即可。

否则考虑DP,设$f[i][j]$表示从$i$点以速度$j$出发最多能经过多少个点。

注意到将DP值相同的合并可以将$f[i][j]$按$j$划分成$O(n)$段区间,故用区间进行整体转移即可。

在求出DP数组后,再从原点出发,每次贪心选取字典序最小的且能走到最多点数的后继即可。

时间复杂度$O(n^3\log n)$。

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int N=260,M=N*2;
const double inf=1e20,eps=1e-9;
int _,n,i,j,k,x,y,X,ret,cnt[N],cg;double vy,ma,l,r,vl,vr;
struct P{int x,y,p;}a[N];
struct E{
double l,r;int f;
E(){}
E(double _l,double _r,int _f){l=_l,r=_r,f=_f;}
}f[N][M],g[N*M],h[N*M];
inline bool cmp(const P&a,const P&b){return a.y==b.y?a.p<b.p:a.y<b.y;}
inline bool cmpE(const E&a,const E&b){return a.l<b.l;}
void NO(){
puts("Cannot visit any targets");
exit(0);
}
inline int sgn(double x){
if(x>eps)return 1;
if(x<-eps)return -1;
return 0;
}
inline void cal(int dy,int d,double L,double R){
if(!dy){
if(d){
l=inf,r=-inf;
return;
}
l=L,r=R;
return;
}
double t=dy/vy;
L=max(L,1.0*d/t-ma*t/2);
R=min(R,1.0*d/t+ma*t/2);
if(sgn(L-R)>=0){
l=inf,r=-inf;
return;
}
double A=ma,B=-2.0*ma*t,C=0.5*ma*t*t+L*t-d;
double x=(-B-sqrt(max(B*B-4.0*A*C,0.0)))/(A*2.0);
r=L-ma*x+ma*(t-x);
A=-ma,B=2.0*ma*t,C=-0.5*ma*t*t+R*t-d;
x=(-B+sqrt(max(B*B-4.0*A*C,0.0)))/(A*2.0);
l=R+ma*x-ma*(t-x);
}
inline void merge(){
static int c[N],l[N],r[N];
int i;
for(i=0;i<=n;i++)c[i]=0;
for(i=1;i<=cg;i++)c[n-g[i].f]++;
l[0]=1,r[0]=c[0];
for(i=1;i<=n;i++)l[i]=c[i-1]+1,r[i]=c[i]+=c[i-1];
for(i=1;i<=cg;i++)h[c[n-g[i].f]--]=g[i];
for(i=0;i<=n;i++)if(l[i]<r[i])sort(h+l[i],h+r[i]+1,cmpE);
int m=1;
for(i=2;i<=cg;i++){
if(h[i].f==h[m].f&&sgn(h[m].r-h[i].l)>=0)h[m].r=max(h[m].r,h[i].r);
else h[++m]=h[i];
}
cg=m;
}
inline void go(int x){
int Y,Z=n+1,i,j,k;
for(i=n;i>X;i--)if(a[i].p<Z){
bool flag=0;
for(j=1;j<=cnt[i];j++)if(f[i][j].f==x-1)for(k=1;k<=cg;k++){
cal(a[i].y-a[X].y,a[i].x-a[X].x,g[k].l,g[k].r);
l=max(l,f[i][j].l);
r=min(r,f[i][j].r);
if(sgn(l-r)>=0)continue;
flag=1;
break;
}
if(flag)Y=i,Z=a[i].p;
}
printf("%d",Z);
if(x>1)putchar(' ');
int m=0;
for(j=1;j<=cnt[Y];j++)if(f[Y][j].f==x-1)for(k=1;k<=cg;k++){
cal(a[Y].y-a[X].y,a[Y].x-a[X].x,g[k].l,g[k].r);
l=max(l,f[Y][j].l);
r=min(r,f[Y][j].r);
if(sgn(l-r)>=0)continue;
h[++m]=E(l,r,0);
}
for(i=1;i<=m;i++)g[i]=h[i];
cg=m;
X=Y;
}
int main(){
scanf("%d%lf%lf",&_,&vy,&ma);
while(_--){
scanf("%d%d",&x,&y);
if(y<0)continue;
a[++n].x=x;
a[n].y=y;
}
if(!n)NO();
for(i=1;i<=n;i++)a[i].p=i;
sort(a,a+n+1,cmp);
if(ma<0.5){
for(_=0,i=1;i<=n;i++)if(a[i].x==0){
if(_++)putchar(' ');
printf("%d",a[i].p);
}
if(!_)NO();
return 0;
}
for(i=n;~i;i--){
g[cg=1]=E(-inf,inf,0);
for(j=n;j>i;j--)for(k=1;k<=cnt[j];k++){
cal(a[j].y-a[i].y,a[j].x-a[i].x,f[j][k].l,f[j][k].r);
if(sgn(l-r)>=0)continue;
g[++cg]=E(l,r,f[j][k].f+1);
}
merge();
for(j=1;j<=cg;j++)f[i][j]=h[j];
cnt[i]=cg;
}
for(i=1;i<=cnt[0];i++)if(f[0][i].l<eps&&f[0][i].r>-eps&&f[0][i].f){
ret=f[0][i].f;
break;
}
if(!ret)NO();
g[cg=1]=E(-eps,eps,0);
for(i=ret;i;i--)go(i);
return 0;
}

  

BZOJ4081 : [Wf2014]Skiing的更多相关文章

  1. bzoj AC倒序

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

  2. nyoj 10 skiing(记忆化搜索)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  3. skiing(搜索+记忆化搜索)

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5   描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  4. NYOJ10,skiing

    skiing 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区域必须向下倾斜,并且 ...

  5. ACM Skiing问题

    ACM Skiing问题 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michae ...

  6. 2017 ACM-ICPC(乌鲁木齐赛区)网络赛 H.Skiing 拓扑排序+最长路

    H.Skiing In this winter holiday, Bob has a plan for skiing at the mountain resort. This ski resort h ...

  7. [SCOI2015]国旗计划[Wf2014]Surveillance

    [SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...

  8. BZOJ4083 : [Wf2014]Wire Crossing

    WF2014完结撒花~ 首先求出所有线段之间的交点,并在交点之间连边,得到一个平面图. 这个平面图不一定连通,故首先添加辅助线使其连通. 然后求出所有域,在相邻域之间连一条代价为$1$的边. 对起点和 ...

  9. POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)

    题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...

随机推荐

  1. 网站申请HTTPS 访问

    #生成证书和key openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout /opt/nginx/pdk.key -out /opt ...

  2. TypeScipt学习

    TypeScript具有类型系统,且是JavaScript的超集.它可以编译成普通的JavaScript代码. TypeScript支持任意浏览器,任意环境,任意系统并且是开源的.Ts主要用于解决那些 ...

  3. [转] meta标签的作用及整理

    meta的标签的使用是我在前端学习中曾经困惑过一段时间的问题.一方面不是很了解meta标签的用途,另一方面是对于meta标签里的属性和值不是懂,也不知道从哪里冒出来的,所以这篇文章专门整理下meta标 ...

  4. .Net Core下发送WebRequest请求的两种方式

    1.使用RestSharp.NetCore 2.使用WebApi请求方式

  5. python全栈开发day77-博客主页

    1.文章分类 2.标签 3.归档 1) MySQL的日期格式化函数 DATE_FORMAT(字段名,格式) 2) Django ORM中如何执行SQL原生语句 (1) models.Article.o ...

  6. python全栈开发day52-bootstrap的运用

    1. css样式 2. 插件 3.  创建一个项目的步骤 1) npm init --yes  或 npm init -y npm init npm init:这个命令用于创建一个package.js ...

  7. js清除单选框所选的值

    js清除单选框所选的值 $("input[type='radio']").removeAttr('checked');

  8. Selenium3详解(基本操作,定位方法)

    如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动. 基本操作: 刷新:refresh, 获取浏览器窗口大小:get_window_size 设置浏览器窗口大小:set_w ...

  9. README 语法记录

    转自:nblogs.com/liugang-vip/p/6337580.html 正文: 1.标题的几种写法: 第一种:     前面带#号,后面带文字,分别表示h1-h6,上图可以看出,只到h6,而 ...

  10. Java 之 JQuery

    1.JQuery a.定义:jQuery 是一个 JavaScript 库 b.作用:极大地简化了 JavaScript 编程 c.引入: <script src="jquery.js ...