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. 树莓派 -- 输入设备驱动 (key) 续2: 转载 Setting up a GPIO-Button “keyboard” on a Raspberry Pi

    使用device-tree (DT) overlay应该是更方便的方法: http://blog.gegg.us/2017/01/setting-up-a-gpio-button-keyboard-o ...

  2. Python之面向对象新式类和经典类

    Python之面向对象新式类和经典类 新式类和经典类的继承原理: 在Python3中,就只有新式类一种了. 先看Python3中新式类: 类是有继承顺序的: Python的类是可以继承多个类的,也就是 ...

  3. 全国高校json数据包(复python解析代码)

    由于这段时间需要有关学校的三级联动插件,找了很久没有找到合适的,所以去教育部官网下载了一份全国普通高校名单(2019年), 这里附上解析该xls文件的代码 import xlrd import jso ...

  4. LeetCode 122. Best Time to Buy and Sell Stock II (stock problem)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  5. jquery源码——noConflict实现

    实现方式很简单:在初始化的时候,记录当前全局中jQuery和$两个变量的的值,用_jQuery和_$分别存放,调用noConflict方法时,使用_jQuery和_$分别恢复对应的值,并且返回jQue ...

  6. noip模拟赛 入阵曲

    分析:其实很容易想到O(n^3m^3)的算法,枚举x1,x2,y1,y2,再统计一下和.求和可以用前缀和,能优化到O(n^2m^2),能得到60分.对于特殊性质的点,求一下a[i][j]与k的最小公倍 ...

  7. 【Intellij 】Intellij IDEA 添加jar包的三种方式

    一.直接复制:(不推荐) 方法:直接将硬盘上的jar包复制粘贴到项目的lib目录下即可. 注意: 1.对于导入的eclipse项目,该方式添加的jar包没有任何反应,用make编译项目会报错 2.对于 ...

  8. Swap Nodes in Pairs(链表操作)

    Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...

  9. Servlet的Cookies处理

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/cookies-handling.html: Cookies是存储在客户端计算机上的文本文件,用于 ...

  10. 积累——SQLCommand命令

    SQLcommand表示要对SQL数据库运行的一个 T-SQL 语句或存储过程.以便运行大量操作或处理数据库结构. 在对数据库訪问的时候,就经经常使用到这个.看看它是怎么做到的吧! 一.属性 Comm ...