[题目链接]

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. axios方法get及post代码示例

    show: function(){ //get方式 //赋值给变量self var self = this; var url = "hotcity.json"; axios.get ...

  2. Vue指令3:v-for

    列表渲染 我们用 v-for 指令根据一组数组的选项列表进行渲染.v-for 指令需要使用item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名. & ...

  3. ThinkPHP---插件highcharts

    [一]概论 (1)介绍 基于jquery开发的国外图标插件,统计图,折线图,饼状图等常常用到. 国内也有一款类似插件echarts,由百度开发. (2)官网:www.highcharts.com    ...

  4. flipt 一个基于golang 的特性工具开发类库

    以前介绍过一个Flagr 的基于golang 的特性功能开发类库(技术雷达推荐),今天看到一个类似也很不错的方案flipt 参考架构 包含的特性 快速,使用golang 编写,同时进行了性能优化 运行 ...

  5. Crossword Answers UVA - 232

    题目大意 感觉挺水的一道题.找出左面右面不存在或者是黑色的格子的白各,然后编号输出一横向单词和竖向单词(具体看原题) 解析 ①找出各个格子的编号 ②对每个节点搜索一下 ③输出的时候注意最后一个数据后面 ...

  6. linux性能优化cpu-02平均负载

    每次我们系统变慢时,我们通常做的第一件事就是top命令或者uptime命令,看一下系统的负载情况,比如下面: 我在命令行中输入uptime 22:15:51    表示当前系统时间 up 13 min ...

  7. linux nethogs-终端下的网络流量监控工具

    推荐:更多linux 性能监测与优化 关注:linux命令大全 有很多适用于Linux系统的开源网络监视工具.比如说,你可以用命令iftop来检查带宽使用情况.netstat用来查看接口统计报告,还有 ...

  8. Turtle-可视化界面画圣诞树

    圣诞节(Christmas)又称耶诞节.耶稣诞辰,译名为“基督弥撒”,是西方传统节日,起源于基督教,在每年公历12月25日.弥撒是教会的一种礼拜仪式.圣诞节是一个宗教节,因为把它当作耶稣的诞辰来庆祝, ...

  9. 洛谷 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    [题解] 就是基环外向树森林找环,然后从环向外统计size就可以了. #include<cstdio> #include<cstring> #include<algori ...

  10. 洛谷 2176 [USACO14FEB]路障Roadblock

    [题意概述] 修改图中任一一条边的边权,使其加倍,问怎样使修改后图中的1~n的最短路最大.输出最短路的增量. [题解] 先跑一遍dijkstra求出1~n的路径长度,记录下经过的边.枚举这些边进行修改 ...