BZOJ4081 : [Wf2014]Skiing
首先将目标点按$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的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- nyoj 10 skiing(记忆化搜索)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...
- skiing(搜索+记忆化搜索)
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...
- NYOJ10,skiing
skiing 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描写叙述 Michael喜欢滑雪百这并不奇怪, 由于滑雪的确非常刺激.但是为了获得速度,滑的区域必须向下倾斜,并且 ...
- ACM Skiing问题
ACM Skiing问题 描述 Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michae ...
- 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 ...
- [SCOI2015]国旗计划[Wf2014]Surveillance
[SCOI2015]国旗计划 A国正在开展一项伟大的计划——国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这 项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名 ...
- BZOJ4083 : [Wf2014]Wire Crossing
WF2014完结撒花~ 首先求出所有线段之间的交点,并在交点之间连边,得到一个平面图. 这个平面图不一定连通,故首先添加辅助线使其连通. 然后求出所有域,在相邻域之间连一条代价为$1$的边. 对起点和 ...
- POJ 3037 Skiing(如何使用SPFA求解二维最短路问题)
题目链接: https://cn.vjudge.net/problem/POJ-3037 Bessie and the rest of Farmer John's cows are taking a ...
随机推荐
- HDU 4763 Theme Section(KMP灵活应用)
Theme Section Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- django-会话 cookie 中缺少HttpOnly 属性-安全加强
如果django程序扫描到会话 cookie 中缺少 HttpOnly 属性问题,需要如何进行安全加强? https://docs.djangoproject.com/en/2.2/ref/setti ...
- Aho-Corasick算法实现(简单关键字过滤)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...
- [转] meta标签的作用及整理
meta的标签的使用是我在前端学习中曾经困惑过一段时间的问题.一方面不是很了解meta标签的用途,另一方面是对于meta标签里的属性和值不是懂,也不知道从哪里冒出来的,所以这篇文章专门整理下meta标 ...
- Android 实现连续两次点击或连续多次点击退出应用
前言: 日常开发过程中,经常会遇到“连续点击两次退出应用”的需求(和“连续点击多次”的需求(如:手机从设置中进入开发者选项). 直接上代码:双击退出: private long exitTime = ...
- MediatR
1.MediatR是什么? 微软官方eshopOnContainer开源项目中使用到了该工具, mediatR 是一种中介工具,解耦了消息处理器和消息之间耦合的类库,支持跨平台 .net Standa ...
- Linux 命令行敲命令 光标移动快捷键
在单词之间跳转,使用Ctrl+左右键. Ctrl+a跳到本行的行首, Ctrl+e则跳到页尾. Ctrl+u删除当前光标前面的文字 ctrl+k-删除当前光标后面的文字 Ctrl+w和Alt+d-对于 ...
- Sql与C#中日期格式转换总结
SQL中的转换方法: 一.将string转换为datetime,主要是使用Convert方法, 方法,Convert(datetime [ ( length ) ] , expression, [st ...
- spring security实现动态配置url权限的两种方法
缘起 标准的RABC, 权限需要支持动态配置,spring security默认是在代码里约定好权限,真实的业务场景通常需要可以支持动态配置角色访问权限,即在运行时去配置url对应的访问角色. 基于s ...
- net core体系-web应用程序-4net core2.0大白话带你入门-10asp.net core session的使用
asp.net core session的使用 Session介绍 本文假设读者已经了解Session的概念和作用,并且在传统的.net framework平台上使用过. Asp.net core ...