description

solution

  • 考虑预处理出\(f[i][j]\)表示在第\(i\)个点加满油后,从第\(i\)个点出发,至多消耗\(j\)元钱走过的最大路程,那么对于每一个询问就可以二分答案\(O(logq)\)查询了
  • 可以得出转移方程\(f[i][k]=\max(f[j][k-p[j]]+g[i][j],f[i][k])\),其中\(g[i][j]\)表示从在\(i\)点加满油后从\(i\)走到\(j\)能走过的最大路程
  • \(g\)可以使用倍增\(floyd\)预处理出\(h[k][i][j]\)表示从\(i\)走到\(j\),至多走\(2^k\)步的最长路程后求出。
  • 倍增\(floyd\)代码:
for(int k=1;k<=16;++k){
memcpy(h[k],h[k-1],sizeof(h[k]));
for(int w=1;w<=n;++w)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(h[k-1][i][w]>inf&&h[k-1][w][j]) h[k][i][j]=max(h[k][i][j],h[k-1][i][w]+h[k-1][w][j]);
}
  • 于是我们就可以\(O(n^3logC)\)完成预处理,总时间复杂度\(O(n^3logC+Tlogq)\)

code

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,m,C,T,p[N],c[N],b[N],inf;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}
while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
int f[N][N*N];//在i加了油后出发,用j块钱能走的最大路程
int g[N][N];//在i处加了油后从i到j的最长路
int h[20][N][N];//从i走到j,至多走1<<k条路的最长路
int main(){
n=read();m=read();C=read();T=read();
for(int i=1;i<=n;++i) p[i]=read(),c[i]=read();
memset(h,192,sizeof(h));inf=h[0][0][0];
for(int i=1;i<=n;++i) h[0][i][i]=0;
for(int i=1;i<=m;++i){
int u=read(),v=read(),w=read();
h[0][u][v]=max(h[0][u][v],w);
}
for(int k=1;k<=16;++k){
memcpy(h[k],h[k-1],sizeof(h[k]));
for(int w=1;w<=n;++w)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(h[k-1][i][w]>inf&&h[k-1][w][j]) h[k][i][j]=max(h[k][i][j],h[k-1][i][w]+h[k-1][w][j]);
}
for(int i=1;i<=n;++i){
memset(g[i],192,sizeof(g[i]));g[i][i]=0;
int s=min(C,c[i]);
for(int k=0;k<=16;++k){
if((s>>k)&1){
memset(b,inf,sizeof(b));
for(int j=1;j<=n;++j){
if(g[i][j]>inf){
for(int w=1;w<=n;++w)
if(h[k][j][w]>inf) b[w]=max(b[w],g[i][j]+h[k][j][w]);
}
}
memcpy(g[i],b,sizeof(b));
}
}
}
for(int k=0;k<=n*n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
f[i][k]=max(f[i][k],g[i][j]);
for(int k=0;k<=n*n;++k)
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(k>=p[j]) f[i][k]=max(f[i][k],f[j][k-p[j]]+g[i][j]);
while(T--){
int u=read(),q=read(),d=read();
int l=p[u],r=q;
while(l<r){
int mid=(l+r)>>1;
if(f[u][mid-p[u]]>=d) r=mid;
else l=mid+1;
}
if(f[u][l-p[u]]<d) puts("-1");
else printf("%d\n",q-l);
}
return 0;
}

「LOJ 539」「LibreOJ NOIP Round #1」旅游路线的更多相关文章

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

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

  2. LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维

    考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正 ...

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

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

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

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

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

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

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

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

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

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

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

    description 题面很长,这里给出题目链接 solution 用队列维护扔掉的红茶,同时若后扔出的红茶比先扔出的红茶编号更小,那么先扔出的红茶不可能成为答案,所以可以用单调队列维护 故每次询问 ...

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

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

随机推荐

  1. 为什么使用CNN作为降噪先验?

    图像恢复的MAP推理公式: $\hat{x}\text{}=\text{}$arg min$_{x}\frac{1}{2}||\textbf{y}\text{}-\text{}\textbf{H}x| ...

  2. D. Road to Post Office 解析(思維)

    Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...

  3. 惊呆了!Spring Boot 还能开启远程调试?

    持续原创输出,点击上方蓝字关注我 目录 前言 什么是远程调试? 为什么要远程调试? 什么是JPDA? 如何开启调试? transport server suspend address onthrow ...

  4. 串口服务器和modbus网关有什么不同

    串口服务器是什么? 串口服务器一般也会被称之为串口设备服务器,它是一种小型电子设备,可以将以太网IP/TCP数据包转换为RS232,RS485或RS422串口数据信号,反之亦然. Modbus网关是什 ...

  5. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

  6. Java_静态代理与Lambda

    静态代理 要点: 公共接口 真实角色 代理角色 public class StaticProxy { public static void main(String[] args) { You you ...

  7. 一次打包引发的思考,原来maven还能这么玩?

    持续原创输出,点击上方蓝字关注我 目录 前言 依赖关系 你会怎么做? 必知的几个参数 总结 前言 昨天有一个读者找我的交流工作心得,偶然间提到一个有趣的问题,如下: 「大致的意思」:公司最近在整多模块 ...

  8. 利用MultipartFile来进行文件上传

    这个例子实在SpringMVC的基础上完成的,因此在web.xml中需要配置 web.xml <!-- 配置Spring MVC的入口 DispatcherServlet,把所有的请求都提交到该 ...

  9. 操作失误不要慌,这个命令给你的Git一次反悔的机会

    今天我们来介绍git当中两个非常非常好用的工具,git show和reflog. 这两个命令虽然不是必知必会,但是如果熟练使用可以极大地帮助我们查看代码仓库的问题,以及在我们操作失误的时候拯救我们.可 ...

  10. .NET操作Excel

    一.读取Excel数据,并显示 1.配置文件 <configuration> <system.web> <compilation debug="true&quo ...