[题目链接]

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. CAD在网页中绘图,并为新绘的对象写扩展数据和读取扩展数据

    在网页中绘图,并为新绘的对象写扩展数据和读取扩展数据.下面帮助的完整例子,在控件安装目录的 Sample\Ie\iedemo.htm 中. 主要用到函数说明: _DMxDrawX::InsertBlo ...

  2. Opencv下双线性插值法进行图像放缩

    关于图像放缩的算法有很多,本文主要介绍双线性插值法进行图像放缩,本文参考了: http://www.cnblogs.com/funny-world/p/3162003.html 我们设源图像src的大 ...

  3. python输出带颜色字体详解

    在python开发的过程中,经常会遇到需要打印各种信息.海量的信息堆砌在控制台中,就会导致信息都混在一起,降低了重要信息的可读性.这时候,如果能给重要的信息加上字体颜色,那么就会更加方便用户阅读了. ...

  4. Python-文件和数据格式化

    文件的使用 >文件的类型 文件的理解:文件是数据的抽象和集合 -文件时存储在辅助存储器上的数据序列 -文件是数据存储的一种形式 -文件展现形态:文本文件和二进制文件 文本文件vs.二进制文件 - ...

  5. SQL学习笔记:库和表的创建

    目录 创建和删除数据库 创建和删除表 添加.修改和删除字段 创建和删除数据库 CREATE DATABASE justForLearn; DROP DATABASE justForLearn; 创建和 ...

  6. 洛谷 3959 宝藏 NOIP2017提高组Day2 T2

    [题解] 状压DP. f[i]表示现在的点是否连接的状态是i. #include<cstdio> #include<cstring> #include<algorithm ...

  7. PAT 1143 Lowest Common Ancestor

    The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U ...

  8. http://localhost/main/company/jurtion---外卖权限添加

    http://localhost/main/company/jurtion---外卖权限添加

  9. HDU 1253 三维数组的图上找最短路

    题目大意: 从三维空间的(0,0,0)出发到(a-1,b-1,c-1),每移动一个都要时间加一,计算最短时间 根据六个方向,开个bfs,像spfa那样计算最短路径就行了,但是要1200多ms,也不知道 ...

  10. poj 1379 模拟退火法

    /* 模拟退火法: 找到一些随机点,从这些点出发,随机的方向坐标向外搜索: 最后找到这些随机点的最大值: 坑://if(xx>-eps&&xx<x+eps&& ...