[题目链接]

https://loj.ac/problem/539

[算法]

首先 , 我们用f[u][k]表示现在在景点u ,还有k元钱 , 最多能够走多少路

不难发现f[u][k] = max{ f[v][k - P[u]] + Dist(u,v,min(C,ci)) } ( dist(u,v,w)表示从u走到v , 最多经过w条路 , 最多能走多少路 )

用倍增弗洛伊德求dist, 然后进行上述dp , 即可

时间复杂度 : O(N^4 + N^3logN + TlogQ)

[代码]

#include<bits/stdc++.h>
using namespace std;
const int inf = 1e9;
#define MAXN 110
#define MAXLOG 20 int n,m,C,T,tot;
int head[MAXN];
int a[MAXN],b[MAXN],p[MAXN],c[MAXN];
int dis[MAXN][MAXN],f[MAXN][MAXN * MAXN];
int mat[MAXLOG][MAXN][MAXN]; template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
} int main()
{ read(n); read(m); read(C); read(T);
for (int i = ; i <= n; i++)
{
read(p[i]);
read(c[i]);
c[i] = min(c[i],C);
}
for (int i = ; i <= n; i++)
{
for (int j = ; j <= n; j++)
{
if (i != j)
mat[][i][j] = -inf;
}
}
for (int i = ; i <= m; i++)
{
int u,v,w;
read(u); read(v); read(w);
mat[][u][v] = max(mat[][u][v],w);
}
for (int i = ; i < MAXLOG; i++)
{
memcpy(mat[i],mat[i - ],sizeof(mat[i]));
for (int k = ; k <= n; k++)
{
for (int x = ; x <= n; x++)
{
for (int y = ; y <= n; y++)
{
if (mat[i - ][x][k] != -inf && mat[i - ][k][y] != -inf)
mat[i][x][y] = max(mat[i][x][y],mat[i - ][x][k] + mat[i - ][k][y]);
}
}
}
}
for (int i = ; i <= n; i++)
{
for (int x = ; x <= n; x++) a[x] = -inf;
a[i] = ;
for (int k = ; k < MAXLOG; k++)
{
if (c[i] & ( << k))
{
for (int x = ; x <= n; x++) b[x] = -inf;
for (int x = ; x <= n; x++)
{
for (int y = ; y <= n; y++)
{
b[y] = max(b[y],a[x] + mat[k][x][y]);
}
}
memcpy(a,b,sizeof(a));
}
}
for (int j = ; j <= n; j++) dis[i][j] = a[j];
}
for (int i = ; i <= n * n; i++)
{
for (int j = ; j <= n; j++)
{
if (i < p[j])
{
f[j][i] = ;
continue;
}
for (int k = ; k <= n; k++) f[j][i] = max(f[j][i],f[k][i - p[j]] + dis[j][k]);
}
}
while (T--)
{
int s,q,d;
read(s); read(q); read(d);
if (f[s][q] < d)
{
printf("-1\n");
continue;
}
int l = , r = q , mid , ans;
while (l <= r)
{
mid = (l + r) >> ;
if (f[s][mid] >= d)
{
ans = mid;
r = mid - ;
} else l = mid + ;
}
printf("%d\n",q - ans);
} return ; }

[LibreOJ NOIP Round #1] 旅游路线的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    [题意]LibreOJ [算法]乱搞 [题解]容易发现数列最后一定单调,最后单调递增则最大值赋为最后一个,反之最小值赋为最后一个,然后处理一些细节就可以AC,要注意以下几点: 1.数列连续三项以及数列 ...

随机推荐

  1. Spring框架系列(七)--Spring常用注解

    Spring部分: 1.声明bean的注解: @Component:组件,没有明确的角色 @Service:在业务逻辑层使用(service层) @Repository:在数据访问层使用(dao层) ...

  2. java环境初级部署及项目搭建

    一.网页地址 Java各版本下载地址: http://www.oracle.com/technetwork/cn/java/archive-139210-zhs.html Eclipse官方下载地址: ...

  3. java用递归输出目录结构

    package com.janson.day20180827; import java.io.File; public class TestTreeStructureDirectory { publi ...

  4. pageContext对象的使用及常用方法

    pageContext对象的使用及常用方法 制作人:全心全意 获取页面上下文的pageContext对象是一个比较特殊的对象,通过它可以获取JSP页面的request.response.session ...

  5. response对象处理HTTP文件头(禁用缓存、设置页面自动刷新、定时跳转网页)

    response对象处理HTTP文件头 制作人:全心全意 禁用缓存 在默认情况下,浏览器将会对显示的网页内容进行缓存.这样,当用户再次访问相关网页时,浏览器会判断网页是否有变化,如果没有变化则直接显示 ...

  6. Mysql学习总结(42)——MySql常用脚本大全

    备份 (所有) C:\Program Files\MySQL\MySQL Server 5.6\bin>mysqldump --no-defaults -hlocalhost -P3306 -u ...

  7. Java基础学习总结(80)——Java性能优化详解

    让Java应用程序运行是一回事,但让他们跑得快就是另外一回事了.在面对对象的环境中,性能问题就像来势凶猛的野兽.但JVM的复杂性将性能调整的复杂程度增加了一个级别.这里Refcard涵盖了JVM in ...

  8. [luoguP1373] 小a和uim之大逃离(DP)

    传送门 题解 代码 #include <cstdio> #include <iostream> #define N 802 #define mod 1000000007 int ...

  9. C++标准库:bitset 用法整理&&zoj 3812

    转载: http://happyboy200032.blog.163.com/blog/static/46903113201291252033712/ 头文件:#include <bits/st ...

  10. Java高级应用之泛型与反射

    /*************************************************************************************************** ...