考试的时候是这么想的:
求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$
然而,我这个记忆化搜索 $TLE$ 的很惨$.$
这里讲一下正解:
上面的大题思路是正确的,但是记忆化搜索太慢,考虑倍增 $floyd.$
令 $f[i][j]$ 表示 $i$ 号点花费 $j$ 能走的最远距离$.$
令 $go[i][j][k]$ 表示 $i$ 号点走到 $j$ 号点走 $k$ 步的最远距离(在 $i$ 号点加一次油)$.$
如果能求出 $g[i][j]$,那么 $f[i][j]$ 就表示成 $max(f[i][j],g[i][k][c[i]]+f[k][j-p[i]]).$
考虑如何求 $g[i][j][k]$:
令 $dis[i][j][k]$ 表示 $i$ 到 $j$ 走 $2^{k}$ 步的最远距离$.$
则 $go[i][j][k]=max(go[i][j][k],go[i][a][k-2^l]+dis[i][j][2^{k}])$
将 $c[i]$ 按照二进制展开,那么可以从低到高位枚举这个 $2^l$,将$go[i][j][k]$ 中第三维压掉,直接是 $tmp[i][j]=max(tmp[i][j],go[i][k]+dis[k][j][l])$ $.$ 反正这 $c[i]$ 步都要走完,直接枚举二进制就好了.

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 103
#define inf 1000000300
#define setIO(s) freopen(s".in","r",stdin) //, freopen(s".out","w",stdout)
using namespace std;
int n,m,C,T;
int p[N],c[N],dis[N][N][22],go[N][N],tmp[N][N],f[N][N*N];
int main()
{
int i,j,k;
// setIO("input");
scanf("%d%d%d%d",&n,&m,&C,&T);
memset(dis,0xc2,sizeof dis);
for(i=1;i<=n;++i) scanf("%d%d",&p[i],&c[i]), dis[i][i][0]=0;
for(i=1;i<=m;++i)
{
int a,b,l;
scanf("%d%d%d",&a,&b,&l);
dis[a][b][0]=max(dis[a][b][0], l);
}
for(int t=1;t<=20;++t)
{
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
for(k=1;k<=n;++k)
dis[i][j][t]=max(dis[i][j][t], dis[i][k][t-1]+dis[k][j][t-1]);
}
for(i=1;i<=n;++i)
{
int cc=min(c[i], C);
for(j=1;j<=n;++j) go[i][j]=tmp[i][j]=-inf;
go[i][i]=0;
for(int l=0;l<=20;++l)
{
if((1<<l)&cc)
{
for(j=1;j<=n;++j)
for(k=1;k<=n;++k)
tmp[i][j]=max(tmp[i][j], go[i][k]+dis[k][j][l]);
for(j=1;j<=n;++j) go[i][j]=tmp[i][j];
}
}
}
for(i=1;i<=n;++i) f[i][0]=0;
for(j=1;j<=n*n;++j)
{
for(i=1;i<=n;++i)
if(j>=p[i])
{
for(k=1;k<=n;++k)
f[i][j]=max(f[i][j], go[i][k]+f[k][j-p[i]]);
}
}
int cas;
for(cas=1;cas<=T;++cas)
{
int s,q,d;
scanf("%d%d%d",&s,&q,&d);
int l=1,r=q,mid,ans=-1;
while(l<=r)
{
mid=(l+r)>>1;
if(f[s][mid]>=d) ans=mid,r=mid-1;
else l=mid+1;
}
// printf("%d\n",f[s][ans]);
printf("%d\n",ans==-1?ans:q-ans);
}
return 0;
}

  

LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维的更多相关文章

  1. LOJ#539. 「LibreOJ NOIP Round #1」旅游路线

    n<=100,m<=1000的图,在此图上用油箱容量C<=1e5的车来旅行,旅行时,走一条边会耗一单伟油,在点i时,若油量<ci,则可以把油以pi的价格补到ci,pi<= ...

  2. LibreOJ #539. 「LibreOJ NOIP Round #1」旅游路线(倍增+二分)

    哎一开始看错题了啊T T...最近状态一直不对...最近很多傻逼题都不会写了T T 考虑距离较大肯定不能塞进状态...钱数<=n^2能够承受, 油量再塞就不行了...显然可以预处理出点i到j走c ...

  3. 【LibreOJ】#539. 「LibreOJ NOIP Round #1」旅游路线

    [题意]给定正边权有向图,车油量上限C,每个点可以花费pi加油至min(C,ci),走一条边油-1,T次询问s点出发带钱q,旅行路程至少为d的最多剩余钱数. n<=100,m<=1000, ...

  4. LibreOj #539. 「LibreOJ NOIP Round #1」旅游路线

    题目链接 做完这道题,我深知当一个问题复杂度过高的时候,把一些可以分离的操作都分散开,可以大幅度降低复杂度..... 发现无论有多少钱,每到一个点后扩展到的距离被限制在 \(min(C, c[i])\ ...

  5. 「LOJ 539」「LibreOJ NOIP Round #1」旅游路线

    description 题面较长,这里给出题目链接 solution 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那 ...

  6. 「LibreOJ NOIP Round #1」旅游路线

    Description T 城是一个旅游城市,具有 nnn 个景点和 mmm 条道路,所有景点编号为 1,2,...,n1,2,...,n1,2,...,n.每条道路连接这 nnn 个景区中的某两个景 ...

  7. LOJ#541. 「LibreOJ NOIP Round #1」七曜圣贤

    有一辆车一开始装了编号0-a的奶茶,现有m次操作,每次操作Pi在[-1,b),若Pi为一个未出现过编号的奶茶,就把他买了并装上车:若Pi为一个在车上的奶茶,则把他丢下车:否则,此次操作为捡起最早丢下去 ...

  8. 「LOJ 537」「LibreOJ NOIP Round #1」DNA 序列

    description NOIP 复赛之前,HSD 桑进行了一项研究,发现人某条染色体上的一段 DNA 序列中连续的\(k\)个碱基组成的碱基序列与做题的 AC 率有关!于是他想研究一下这种关系. 现 ...

  9. 「LOJ 538」「LibreOJ NOIP Round #1」数列递推

    description sosusosu 虐爆 OI 之后成为了一名文化课选手.一天,他做作业碰到了一堆数列问题,每道题给出的数列都是以下形式: 给定一个下标从\(0\)开始,无限长的整数列\({a_ ...

随机推荐

  1. 最新的省市编码和sql

    下面的项目是整理的最新的省市编码sql文件,可以看看. github

  2. 2019JAVA第三次实验报告

    Java实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019.9.24 评分等级 实验三 String类的应用 一.实验目的 掌握类String类的使用: 学会使用JDK ...

  3. 几张图让你看懂WebAssembly

    几张图让你看懂WebAssembly:https://www.jianshu.com/p/bff8aa23fe4d

  4. LOJ167 康托展开 题解

    题面 康托展开: 康托展开是一个全排列到一个自然数的双射,常用于构建哈希表时的空间压缩. 康托展开的实质是计算当前排列在所有由小到大全排列中的名次,因此是可逆的. X = A[0] * (n-1)! ...

  5. isinstance与issubclass,反射

    目录 isinstance与issubclass isinstance issubclass 反射 定义 反射在模块中的应用 内置方法 isinstance与issubclass isinstance ...

  6. WTF!! Vue数组splice方法无法正常工作

    当函数执行到this.agents.splice()时,我设置了断点.发现传参index是0,但是页面上的列表项对应的第一行数据没有被删除, WTF!!! 这是什么鬼!然后我打开Vue Devtool ...

  7. P1397 [NOI2013]矩阵游戏

    传送门 首先显然可以矩乘快速幂然后 $T$ 飞 看一眼题解发现因为这一题矩阵的特殊性所以可以对矩阵的次数欧拉降幂 然而我并不懂证明,所以我选择暴力乱搞的做法 十进制快速幂,然后注意一下常数,还有矩阵乘 ...

  8. 7.jQuery之显示与隐藏效果

    这里用到三个函数方法:show()   hide()  toggle() 注意点是三个方法里面的两个参数的使用,前一个参数是时间,表示显示速度:后一个参数是回调函数,只有前面的动画执行完之后,回调函数 ...

  9. 17.AutoMapper 之配置(Configuration)

    https://www.jianshu.com/p/031ff68797dd 配置(Configuration) 通过构造函数创建并初始化MapperConfiguration实例: config = ...

  10. Spring Boot自动配置总结

    Spring Boot项目启动的时候加载主配置类,并开启了自动配置功能.(Spring Boot的自动配置功能是Spring Boot的一大重要且突出的特性) 那么我们需要了解下它: 如何加载主配置类 ...