首先将目标点按$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. 数据结构c++实现代码-链表

    /*节点Node的相关声明与定义*/ //Node.h #include<iostream> using namespace std; template<typename T> ...

  2. 火狐浏览器无故卡死,未响应或者占大量cpu资源解决方案

    这是火狐社区的文章,对火狐浏览器无故卡死,未响应或者占大量cpu资源有详细的说明和解决,记录下!!! ++++++++++++++++++++++++++++++++ Firefox 挂起 如果您的 ...

  3. Exchange Server Notes

    以下信息来自Option响应: HTTP/1.1 200 OK Cache-Control: private Allow: OPTIONS,POST Server: Microsoft-IIS/7.0 ...

  4. azkaban安装使用

    本文记录azkaban的安装和 一些报错处理(文章末尾). AzKaban组成 MySQL数据库,azkaban-server (web端),azkaban-executor (执行job) 1.下载 ...

  5. Android之Error: 'L' is not a valid file-based resource name character解决办法

    1.问题 Error:Execution failed for task ':mergeBYODReleaseResources'.> /home/chenyu/Android_dev/sang ...

  6. docker挂载点泄露问题

    本来以为我不会遇到. 结果还是遇到了. 现象为k8s delete pod时,系统一直显示Terminatiing,无论多久都不能正常. 以下两个帖子大概说明了是怎么回事. https://blog. ...

  7. Windows Azure 搭建网络代理 Proxy

    额 题目起的有点大 其实就是在 Linux 上使用代理 不过是用的 Azure 上的 Liunx 虚拟机而已 如何在 Azure 上搭建 VPN 见上篇:http://www.cnblogs.com/ ...

  8. sprintf补位

    有的时候需要00001这样的字符串 来源却是Int的1 这个时候就可以用sprintf方法了 $i = 3; $a=sprintf("%08d", $i); echo $a; %0 ...

  9. 【Android】Android apk默认安装位置设置

    在Android工程中,设置apk的默认安装位置 在AndroidManifest.xml文件Manifest标签中添加android:installLocation属性 android:instal ...

  10. Python学习(十七)—— 数据库(二)

    转载自http://www.cnblogs.com/linhaifeng/articles/7356064.html 一. 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是保存于文件中, ...