https://www.zybuluo.com/ysner/note/1284536

题面

给一个一维坐标系,出发点为\(0\),目标点为\(w\)。

每\(1\)秒可以往后移不超过\(s\)个单位距离。

现有\(p\)个虫洞,可以把你从\(s_i\)瞬移到\(t_i\),

问最少多少秒可从出发点到目标点。

  • \(w\leq10^9,2\leq s\leq6,p\leq40\)

解析

注意到\(w+1\)个点中很多点是没有意义的。

有意义的是那\(p\)个虫洞,只有它们可以强行改变答案。

考虑用这\(p\)个虫洞新建一张图。

这需要我们思考,从一个虫洞的终点到另一个虫洞的起点的距离。

设\(x\)轴上它们间距离为\(len\)。

设\(f[i]\)为从当前点开始,到达距离模\(s\)为\(i\)的点的最短距离。

先定一个虫洞,然后枚举第二个虫洞。

然后不断用上一个虫洞终点的\(f[i]\)更新这一个虫洞终点的\(f[i]\)即可。

最后把\(f[len\%s]=inf\),代表不能用其更新下一次答案。

需要注意的是,如果有\(s\)个虫洞的起点连续成段,后面的虫洞就走不到了。

接下来\(SPFA\)解决。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int N=2e3+100,inf=2e9;
int tar,h[50],cnt,s,n,st[50],f[10],g[10];
ll dis[50];
bool vis[50];
struct Edge{int to,nxt,w;}e[N<<1];
struct hol{int l,r;bool operator < (const hol &o) const {return l<o.l;}}a[N];
il void add(re int u,re int v,re int w){e[++cnt]=(Edge){v,h[u],w};h[u]=cnt;}
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
il int ban(re int x)
{
fp(i,0,s-1)
if(x-i>=0&&st[lower_bound(st+1,st+1+n,x-i)-st]!=x-i) return 0;
return 1;
}
il int calc(re int x){return (x+s-1)/s;}
il void Build(re int x)
{
f[0]=0;
fp(i,1,s-1) f[i]=1;
re int las=0,len,yu;
fp(i,1,n)
if(i!=x&&a[i].l>=a[x].r)
{
fp(j,0,s-1) g[j]=inf;
len=a[i].l-a[x].r;
yu=len/s;
fp(j,0,s-1)
fp(k,0,s-1)
if(yu*s+k>=las*s+j) g[k]=min(g[k],f[j]+calc(yu*s+k-las*s-j));
add(x,i,g[len%s]);
g[len%s]=inf;
fp(j,0,s-1) f[j]=g[j];
las=yu;
if(ban(a[i].l)) return;
}
}
il void SPFA(re int S)
{
queue<int>Q;
fp(i,1,n) dis[i]=inf;
dis[S]=0;vis[S]=1;Q.push(S);
while(!Q.empty())
{
re int u=Q.front();Q.pop();
for(re int i=h[u];i+1;i=e[i].nxt)
{
re int v=e[i].to;
if(dis[v]>dis[u]+e[i].w)
{
dis[v]=dis[u]+e[i].w;
if(!vis[v]) Q.push(v),vis[v]=1;
}
}
vis[u]=0;
}
}
int main()
{
while(233)
{
tar=gi();if(!tar) return 0;
memset(h,-1,sizeof(h));cnt=0;
s=gi();n=gi();
fp(i,1,n) a[i].l=gi(),a[i].r=gi();
sort(a+1,a+1+n);
a[n+1].l=a[n+1].r=0;
a[n+2].l=a[n+2].r=tar;
n+=2;
fp(i,1,n) st[i]=a[i].l;
fp(i,1,n) Build(i);
SPFA(n-1);
printf("%lld\n",dis[n]);
}
return 0;
}

[luogu2620]虫洞的更多相关文章

  1. hzwer模拟赛 虫洞

    [题目描述] N个虫洞,M条单向跃迁路径.从一个虫洞沿跃迁路径到另一个虫洞需要消耗一定量的燃料和1单位时间.虫洞有白洞和黑洞之分.设一条跃迁路径两端的虫洞质量差为delta. 1.从白洞跃迁到黑洞,消 ...

  2. BZOJ 1715: [Usaco2006 Dec]Wormholes 虫洞

    Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...

  3. BZOJ1715: [Usaco2006 Dec]Wormholes 虫洞

    1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 475  Solved: 263[Sub ...

  4. 1715: [Usaco2006 Dec]Wormholes 虫洞

    1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 501  Solved: 278[Sub ...

  5. [P2850][USACO06DEC]虫洞Wormholes (最短路)

    死活调不出来 后来是发现这题建边的原因…… 吐血.jpg 所谓的虫洞传说也就是负边了 然后这里打的spfa和原来的不一样 感觉hzwer大佬的spfa好强啊…… 也更易写一点 贴代码 #include ...

  6. bzoj2262: 平行宇宙与虫洞

    Description 量子力学指出,宇宙并非只有一种形态. 根据量子理论,一件事件发生之后可以产生不同的后果,而所有可能的后果都会形成自己的宇宙. 我们可以把一个宇宙看成一个时间轴,虫洞可以看成不同 ...

  7. SPFA穿越虫洞——负权回路得判断

    poj3259 题目大意:穿越虫洞可以回到过去(时间--)所以能不能让时间倒流呢,就是判断有没有负权回路这次尝试用SPFA算法,也可以复习一下链式前向星 准备工作,队列q,spfa算法得有点就在于这个 ...

  8. bzoj 1715: [Usaco2006 Dec]Wormholes 虫洞 -- spfa判断负环

    1715: [Usaco2006 Dec]Wormholes 虫洞 Time Limit: 5 Sec  Memory Limit: 64 MB 注意第一次加边是双向边第二次是单向边,并且每次询问前数 ...

  9. bzoj1715 虫洞

    Description John在他的农场中闲逛时发现了许多虫洞.虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前).John的每个农场有M条小路(无向边)连接着N ...

随机推荐

  1. 如何系统学习并且掌握JavaScript

  2. JavaScript中的特殊数据类型

    JavaScript中的特殊数据类型 制作人:全心全意 转义字符 以反斜杠开头的不可显示的特殊字符通常为控制字符,也被称为转义字符.通常转义字符可以在字符串中添加不可显示的特殊字符,或者防止引号匹配混 ...

  3. ThinkPHP5.X PHP5.6.27-nts + Apache 通过 URL 重写来隐藏入口文件 index.php

    我们先来看看官方手册给出关于「URL 重写」的参考: 可以通过 URL 重写隐藏应用的入口文件 index.php ,Apache 的配置参考: 1.http.conf 配置文件加载 mod_rewr ...

  4. 怎样提高ES集群的稳定性?

    别挂master节点. 稳定性:独立的master节点, 独立的协调节点 > master兼职协调节点 > master兼职数据节点 > master 兼职协调 + 数据节点. cl ...

  5. Webdriver元素定位1

    元素的定位应该是自动化测试的核心,要想操作一个元素,首先应该识别这个元素. webdriver提供了一系列的元素定位方法,常用的有以下几种: id name class name tag link t ...

  6. Leetcode 150.逆波兰表达式求值

    逆波兰表达式求值 根据逆波兰表示法,求表达式的值. 有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总 ...

  7. [Wf2015]Tours

    [Wf2015]Tours 题目 给定一张n个点m条边的无向图,你需要选择一个颜色种类数k,然后用这k种颜色给每条边染色,要求对于图中任意一个简单环,每种颜色的边的数量都相同,求所有可行的k INPU ...

  8. hdu 4325

    #include<stdio.h>//数据弱线段树延迟更新水过 #define N 100100 struct node { int x,y,yanchi,num; }a[N*4]; vo ...

  9. es6常用语法和特性

    简介 首先,在学习之前推荐使用在线转码器 Traceur 来测试 Demo,避免 babel 下的繁琐配置,从而产生畏难情绪. let 命令 在 ES6 之前,JS 只能使用 var 声明变量,或者省 ...

  10. SpringBoot入门系列~Spring-Data-JPA自动建表

    1.pom.xml引入Spring-Data-Jpa和mysql依赖 <!-- Spring-data-jpa依赖 --> <dependency> <groupId&g ...