[题目链接]

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. 删除链表中重复的结点_java

    package algorithms; /* public class ListNode { int val; ListNode next = null; ListNode(int val) { th ...

  2. JDBC配置MSSQL

    使用JDBC连接SQL SERVER 这可能是个很老套的话题,但不管怎么说还是有用的.姑且把配置方法贴出来吧.1. 确认Sql Server的的运行状态打开Sql Server配置管理器,确认Sql ...

  3. php总结回顾

    做人不能一直埋着头往前跑,还要偶尔停下来看下来时的路.所以今天就来回顾下之前的吧 下面依次介绍 [一]TP加载流程 ①应用入口文件index.php→②tp公共入口文件ThinkPHP.php→③核心 ...

  4. C++ std::map的安全遍历并删除元素的方法

    首先我们讲遍历std::map, 大部分人都能写出第一种遍历的方法,但这种遍历删除的方式并不太安全. 第一种 for循环变量: #include<map> #include<stri ...

  5. MyBatis 的基本介绍及使用

    一.简介 ​ MyBatis 是支持定制化 SQL.存储过程以及高级映射的持久层框架(ORM).MyBatis 可以使用简单的 XML 或 注解用于配置和映射数据表,是将 POJO(Plain Old ...

  6. Python之实例属性和类属性

    参考原文 廖雪峰Python 实例属性和类属性 在前面已经说过由于Python是动态语言,可以根据类的实例绑定任何的属性. 给实例绑定属性的方法是通过实例变量,或者self变量绑定的: class S ...

  7. Address already in use: JVM_Bind:8080错误的解决办法

    解决办法:先到命令行查找8080端口号被那个占用,输入后面的命令:netstat -ano 查到 然后到任务管理器把PID为20904的进程给结束掉,就OK了 -------------------- ...

  8. [bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)

    题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...

  9. 【04】AngularJS 表达式

    AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS 表达式写在双大括号内:{{ expression }}. Ang ...

  10. noip模拟赛 dwarf tower

    [问题描述]Vasya在玩一个叫做"Dwarf Tower"的游戏,这个游戏中有n个不同的物品,它们的编号为1到n.现在Vasya想得到编号为1的物品.获得一个物品有两种方式:1. ...