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 ...
随机推荐
- asp.net core 自定义404等友好错误页面
Home控制器里: [Route("Home/Error/{statusCode}")] public IActionResult Error(int statusCode) { ...
- 在th中显示图片
从DataTable中获取值: foreach (DataRow dr in ((DataTable)ViewBag.bookInfoList).Rows) { <tr> <th c ...
- js中类定义函数时用prototype与不用的区别
转载自:https://blog.csdn.net/yexudengzhidao/article/details/72866047 先看例子 function ListCommon2(first,se ...
- context日志
class Program { static void Main(string[] args) { List<wolf_example> Listw; using (var ctx = n ...
- C#default关键字(泛型代码中的默认关键字)
在泛型类和泛型方法中产生的一个问题是,在预先未知以下情况时,如何将默认值分配给参数化类型 T:T 是引用类型还是值类型.如果 T 为值类型,则它是数值还是结构.给定参数化类型 T 的一个变量 t,只有 ...
- [转] 设置div的overflow:scroll,但是在手机上滑动的时候有点卡顿
设置div的overflow:scroll,但是在手机上滑动的时候有点卡顿,所以在这个div上加一个css: -webkit-overflow-scrolling : touch; 在苹果手机上使用- ...
- 【bzoj2131】免费的馅饼 dp+树状数组
题解: 昨天好像做了个几乎一模一样的题目 按照ti排序 |p[i]-p[j]|<=2*(t[i]-t[j]) 然后去绝对值变为三维偏序 发现后两个式子可以推出ti<tj 所以就变成二维偏序 ...
- BZOJ 3745
题解: 分治好题 首先暴力显然rmq可以做到n^2 比较容易想到是以最值分治,这样在数据随机复杂度是nlogn,不随机还是n^2的 以最值分治只有做多与较小区间复杂度相同才是nlogn的 而这题里我们 ...
- 【bzoj4817】[Sdoi2017]树点涂色&&bzoj3779-重组病毒
题解: 两道几乎差不多的题(所以说当年sdoi考了道原题) 都是将树上一段改为新颜色询问颜色数目 可以把改成新颜色这个操作看成access操作 然后通过线段树+dfs序来维护 另外换根了为什么还可以用 ...
- shell常用监控脚本
1.cpu空闲脚本 top -b -n1 |grep 'Cpu'|awk '{print $5}'|sed 's/%//'|sed 's/id,//' 变量赋值 cpu_id='top -b -n1 ...