考虑枚举加油的位置,当确定某次在第$i$个位置加油后,且下一次到$j$加油,那么$i$到$j$必然会选择不超过$c_{i}$条边且最长的路径,记作$d_{i,j}$

如果能求出$d_{i,j}$,再设$f_{q,i}$表示$q$元(恰好用完)从$i$出发的最长路,枚举$i$之后那一次加油点即可转移,由于$q\le n^{2}$,因此这里的复杂度为$o(n^{4})$

接下来,对其求一次前缀max再二分,即可对询问做到$o(t\log_{2}q)$的复杂度

现在还有一个问题,考虑如何预处理最开始的$d_{i,j}$

倍增,求出从$i$出发,走不超过$2^{k}$次走到$j$的最长路,通过枚举走$2^{k-1}$时的点来转移,可以做到$o(n^{3}\log_{2}c_{i})$

类似的,再对每一个点$i$做一次dp,同样枚举中专点转移即可,时间复杂度也是$o(n^{3}\log_{2}c_{i})$

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 #define M 1005
5 #define K 100005
6 struct ji{
7 int nex,to,len;
8 }edge[M];
9 struct qu{
10 int s,q,d;
11 }q[K];
12 int E,n,m,t,x,y,z,head[N],p[N],c[N],g[21][N][N],ff[N],f[N][N],ans[N*N][N];
13 void add(int x,int y,int z){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 edge[E].len=z;
17 head[x]=E++;
18 }
19 int main(){
20 scanf("%d%d%d%d",&n,&m,&c[0],&t);
21 for(int i=1;i<=n;i++){
22 scanf("%d%d",&p[i],&c[i]);
23 c[i]=min(c[i],c[0]);
24 if (!p[i]){
25 printf("orz");
26 return 0;
27 }
28 }
29 memset(head,-1,sizeof(head));
30 for(int i=1;i<=m;i++){
31 scanf("%d%d%d",&x,&y,&z);
32 add(x,y,z);
33 }
34 memset(g,-0x3f,sizeof(g));
35 for(int i=1;i<=n;i++){
36 g[0][i][i]=0;
37 for(int j=head[i];j!=-1;j=edge[j].nex)g[0][i][edge[j].to]=max(g[0][i][edge[j].to],edge[j].len);
38 }
39 for(int i=1;i<=20;i++)
40 for(int x=1;x<=n;x++)
41 for(int y=1;y<=n;y++)
42 for(int z=1;z<=n;z++)
43 g[i][x][y]=max(g[i][x][y],g[i-1][x][z]+g[i-1][z][y]);
44 memset(f,-1,sizeof(f));
45 for(int i=1;i<=n;i++)f[i][i]=0;
46 for(int x=1;x<=n;x++)
47 for(int i=0;i<=20;i++)
48 if (c[x]&(1<<i)){
49 for(int y=1;y<=n;y++)ff[y]=f[x][y];
50 for(int y=1;y<=n;y++)
51 for(int z=1;z<=n;z++)
52 if (ff[z]!=-1)f[x][y]=max(f[x][y],ff[z]+g[i][z][y]);
53 }
54 memset(ans,-0x3f,sizeof(ans));
55 for(int i=1;i<=n;i++)ans[0][i]=0;
56 for(int i=1;i<=n*n;i++)
57 for(int x=1;x<=n;x++)
58 if (p[x]<=i)
59 for(int y=1;y<=n;y++)
60 if (f[x][y]!=-1)ans[i][x]=max(ans[i][x],ans[i-p[x]][y]+f[x][y]);//o(n^4)
61 for(int i=1;i<=n*n;i++)
62 for(int j=1;j<=n;j++)ans[i][j]=max(ans[i][j],ans[i-1][j]);
63 for(int i=1;i<=t;i++){
64 scanf("%d%d%d",&x,&y,&z);
65 if (ans[y][x]<z)printf("-1\n");
66 else{
67 int l=0,r=y;
68 while (l<r){
69 int mid=(l+r>>1);
70 if (ans[mid][x]>=z)r=mid;
71 else l=mid+1;
72 }
73 printf("%d\n",y-l);
74 }
75 }
76 return 0;
77 }

[loj539]旅游路线的更多相关文章

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

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

  2. [solution]JZOJ-5838 旅游路线

    [solution] JZOJ-5838 旅游路线 Time Limits 1000ms,Memory Limits 128MB 题面 Description GZOI队员们到X镇游玩.X镇是一个很特 ...

  3. JZOJ 5838. 旅游路线 最大子段和

    5838. 旅游路线 Time Limits: 1000 ms  Memory Limits: 131072 KB  Detailed Limits   Goto ProblemSet Descrip ...

  4. [loj#539][LibreOJ NOIP Round #1]旅游路线_倍增_dp

    「LibreOJ NOIP Round #1」旅游路线 题目链接:https://loj.ac/problem/539 题解: 这个题就很神奇 首先大力$dp$很好想,因为可以把一维放到状态里以取消后 ...

  5. 带你找到五一最省的旅游路线【dijkstra算法推导详解】

    前言 五一快到了,小张准备去旅游了! 查了查到各地的机票 因为今年被扣工资扣得很惨,小张手头不是很宽裕,必须精打细算.他想弄清去各个城市的最低开销. [嗯,不用考虑回来的开销.小张准备找警察叔叔说自己 ...

  6. 带你找到五一最省的旅游路线【dijkstra算法代码实现】

    算法推导过程参见[dijkstra算法推导详解] 此文为[dijkstra算法代码实现] https://www.cnblogs.com/Halburt/p/10767389.html package ...

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

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

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

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

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

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

随机推荐

  1. Jenkins REST API 实例

    背景:    Jenkins具有丰富的插件生态,足以满足我们日常工作的需求,但如果我们想通过具体的Jenkins任务直接对外提供服务,而不想将内部的具体实现对外暴露(否则,需添加对应的用户权限,通过页 ...

  2. iOS自定义拍照框拍照&裁剪(一)

    卡片机时代 很重要的一点是,相机本身是没有方向概念的,它不理解拍摄的内容,只会以相机自己的坐标系去保存数据,下图展示了相机对"F"进行四个角度拍摄时返回的图片数据. 最初的卡片机时 ...

  3. Hibernate的介绍及入门小案例

    1.Hibernate的诞生 在以前使用传统的JDBC开发应用系统时,如果是小型应用系统,并不觉得有什么麻烦,但是对于大型应用系统的开发,使用JDBC就会显得力不从心,例如对几十,几百张包含几十个字段 ...

  4. docker环境下搭建python3.6

    前言:当我们在一台电脑上搭建了python3.6的环境,下次换了个电脑或者换成linux的系统了又得重新搭建一次,设置环境变量,下载pip等操作.所以使用docker 一.安装python步骤: 1. ...

  5. 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功

    苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 这是苹果wwdc2021 推出的新功能 参考官网链接 App Store Server API | Apple Deve ...

  6. [软工顶级理解组] Beta阶段测试报告

    在测试过程中发现了多少Bug? 测试阶段发现并已修复的bug: 尚且存在,但是难以解决或者不影响使用的bug: 计算重修课程的时候,如果重修课程的课程号和原课程号不同,则GPA计算会出现误差.但我们无 ...

  7. Github点赞超多的Spring Boot学习教程+实战项目推荐!

    Github点赞接近 100k 的Spring Boot学习教程+实战项目推荐!   很明显的一个现象,除了一些老项目,现在 Java 后端项目基本都是基于 Spring Boot 进行开发,毕竟它这 ...

  8. 如何使用原生的Ribbon

    什么是Ribbon 之前分析了如何使用原生的Feign,今天我们来研究 Netflix 团队开发的另外一个类库--Ribbon. Ribbon 和 Feign 有很多相似的地方,首先,它们本质上都是 ...

  9. Linkerd 2:5 分种厘清 Service Mesh 相关术语

    API Gateway(API 网关) API gateway 位于应用程序的前面,旨在解决身份验证和授权.速率限制以及为外部消费者提供公共访问点等业务问题. 相比之下,service mesh 专注 ...

  10. Python matplotlib pylab 画张图

    from pylab import * w1 = 1 w2 = 25 fs = 18 y = np.arange(-2,2,0.001) x = w1*y*log(y)-1.0/w2*exp(-(w2 ...