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. 运维笔记:zabbix的运用(1)安装过程

    前言 如果是用了阿里云或者腾讯云,他们都有各种监控帮我们做好.但是如果是遇到了自己维护自己机房的服务器,那么一些可视化或者监控就很有意义了.监控可能有很多种方案,这里就以比较老牌通吃的zabbix来解 ...

  2. Python面向对象之类属性类方法静态方法

    类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...

  3. I - DFS(依然是漫水填充)

    Description There is a rectangular room, covered with square tiles. Each tile is colored either red ...

  4. vue 子组件修改父组件变量问题

    昨天遇到一个这样的场景, 主页面引用了一个子页面,子页面有个Redio选择,2个选项. 默认的,会从父组件传递一个参数给子组件作为默认值,实现默认选中效果,以及用来做反选. 开始没什么问题,页面都摆上 ...

  5. Thawte 企业版代码签名证书

      Thawte企业版代码签名证书 ,严格验证企业身份,如果您是个人开放者,请申请Thawte 个人代码签名证书.Thawte企业代码签名证书 可帮助程序开发者使用微软代码签名工具(Microsoft ...

  6. python 去掉html中其他属性,只保留href 和 src

    https://segmentfault.com/q/1010000010845573 import re #reg=r'\s+[^(href)]*=\"[^<>]+\" ...

  7. 6.0以上,SYSTEM_ALERT_WINDOW 权限的问题

    6.0以上会因为SYSTEM_ALERT_WINDOW权限的问题,无法在最上层显示. 用户打开软件设置页手动打开,才能授权.路径是:Settings->Apps->App Setting- ...

  8. 【NOIP2017练习】怎样打好隔膜(贪心,堆,带删除priority_queue)

    题意:OI大师抖儿在夺得银牌之后,顺利保送pku.这一天,抖儿问长者:“我的手速虽然已经站在了人类的巅峰,但是打隔膜还是输.我换了很多队友,但是没有用.请问应该怎样打好隔膜?”长者回答:“你啊,Too ...

  9. Codeforces713D. Animals and Puzzle

    $n<=1000,m<=1000$,$n*m$的01矩阵,给$t<=1000000$个询问,每次问一个矩形中最大的1正方形的边长. 先想想不考虑“一个矩形中”的限制,那记$f(i,j ...

  10. cogs——619. [金陵中学2007] 传话

    619. [金陵中学2007] 传话 ★★   输入文件:messagez.in   输出文件:messagez.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 兴趣小 ...