要点

  • 非要先来后到暗示多源最短路,求最小的最大值暗示二分
  • 二分内部的check是关键,dp处理一下,\(dp[i]\)表示第\(i\)笔订单最早何时送达,如果在ddl之前到不了则\(return\ 0\)。我觉得其中\(time\)变量的维护很好地使复杂度降了一维。
  • 第一发WA点:算法看了一遍感觉没有可改的,就把二分的\(r\)调大了,又把\(longlong\)的输入输出改为流,莽试一发就过了……
#include <cstdio>
#include <iostream>
#include <queue>
using namespace std; typedef long long ll;
const int maxn = 1005, maxm = 5005;
const ll INF = 1e18; int n, m, k;
ll s[maxn], u[maxn], t[maxn];
struct Edge {
int to, nxt, cost;
}e[maxm << 1];
int head[maxn], tot;
ll dis[maxn][maxn]; void add(int u, int v, int c) {
e[++tot].to = v, e[tot].cost = c, e[tot].nxt = head[u], head[u] = tot;
} void dij(int st) {
for (int i = 1; i <= n; i++) dis[st][i] = INF;
dis[st][st] = 0; typedef pair<ll, int> pli;
priority_queue<pli, vector<pli>, greater<pli>> Q;
Q.push({0, st}); while (Q.size()) {
ll d = Q.top().first;
int p = Q.top().second;
Q.pop();
if (d > dis[st][p]) continue;
for (int i = head[p]; i; i = e[i].nxt) {
int t = e[i].to;
if (dis[st][t] > d + e[i].cost) {
dis[st][t] = d + e[i].cost;
Q.push({dis[st][t], t});
}
}
}
} bool ok(ll D) {
ll dp[maxn];
dp[0] = 0;
for (int i = 1; i <= k; i++)
dp[i] = INF;
for (int i = 1; i <= k; i++) {
ll val = dis[1][u[i]];
ll st = max(t[i], dp[i - 1] + dis[u[i - 1]][1]);
dp[i] = min(dp[i], st + val);
if (dp[i] > s[i] + D) return 0; ll time = s[i] + D - st - val;
if (time < 0) continue;
for (int j = i + 1; j <= k; j++) {
val += dis[u[j - 1]][u[j]];
if (t[j] > st) {
time -= t[j] - st;
st = t[j];
}
time = min(time, s[j] + D - st - val);
if (time < 0) break;
dp[j] = min(dp[j], st + val);
}
}
return 1;
} int main() {
scanf("%d %d", &n, &m);
for (int i = 1, u, v, c; i <= m; i++) {
scanf("%d %d %d", &u, &v, &c);
add(u, v, c), add(v, u, c);
}
scanf("%d", &k);
for (int i = 1; i <= k; i++)
cin >> s[i] >> u[i] >> t[i]; for (int i = 1; i <= n; i++) {
dij(i);
}
ll l = 0, r = 1e18, ans;
while (l <= r) {
ll mid = (l + r) >> 1;
if (ok(mid)) r = mid - 1, ans = mid;
else l = mid + 1;
}
cout << ans << '\n';
return 0;
}

GYM 101933D(最短路、二分、dp)的更多相关文章

  1. 二分+DP HDU 3433 A Task Process

    HDU 3433 A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  2. POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】

    Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7214   Accepted: 2638 D ...

  3. hdu 3433 A Task Process 二分+dp

    A Task Process Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. 2018.10.24 NOIP模拟 小 C 的数组(二分+dp)

    传送门 考试自己yyyyyy的乱搞的没过大样例二分+dp二分+dp二分+dp过了606060把我自己都吓到了! 这么说来乱搞跟被卡常的正解比只少101010分? 那我考场不打其他暴力想正解血亏啊. 正 ...

  5. 「学习笔记」wqs二分/dp凸优化

    [学习笔记]wqs二分/DP凸优化 从一个经典问题谈起: 有一个长度为 \(n\) 的序列 \(a\),要求找出恰好 \(k\) 个不相交的连续子序列,使得这 \(k\) 个序列的和最大 \(1 \l ...

  6. 【bzoj1044】[HAOI2008]木棍分割 二分+dp

    题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...

  7. poj 2391 Ombrophobic Bovines 最短路 二分 最大流 拆点

    题目链接 题意 有\(n\)个牛棚,每个牛棚初始有\(a_i\)头牛,最后能容纳\(b_i\)头牛.有\(m\)条道路,边权为走这段路所需花费的时间.问最少需要多少时间能让所有的牛都有牛棚可待? 思路 ...

  8. Luogu P2511 [HAOI2008]木棍分割 二分+DP

    思路:二分+DP 提交:3次 错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$ 思路: 先二分答案,不提: 然后有个很$naive$的$DP$: 设$f[i][j] ...

  9. Luogu P1462 通往奥格瑞玛的道路(最短路+二分)

    P1462 通往奥格瑞玛的道路 题面 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己 ...

  10. 洛谷$P4322\ [JSOI2016]$最佳团体 二分+$dp$

    正解:二分+$dp$ 解题报告: 传送门$QwQ$ 这题长得好套路嗷,,,就一看就看出来是个$01$分数规划+树形$dp$嘛$QwQ$. 考虑现在二分的值为$mid$,若$mid\leq as$,则有 ...

随机推荐

  1. 如何识别真Microsoft服务与非Microsoft服务来定位病毒自己的服务

    在我当网管的那段时间,发现有病毒入侵客户服务器,该病毒伪装自己的进程名,我们在服务中发现其也有伪装成系统服务的服务在运行,占用客户服务器的性能,使得CPU与内存的利用率达到90%以上,并持续时间长,甚 ...

  2. matlab保存txt文件

    save roadsurfacepointcloud.xyz -ascii roaddata2 %保存路面点云文件 roaddata2是变量.

  3. 尚学堂xml学习笔记

    1.打开eclipse,文件-新建java project,输入文件的名字,比如输入20181112. 2.对着src右键,选择new-file,输入文件名字,比如:book.xml. 3.开始写.x ...

  4. gVIM+zencoding快速开发HTML/CSS/JS(适用WEB前端)

    一.真正解决了UTF-8中文乱码的各种问题(菜单乱码,内容乱码,提示信息乱码),不用担心WIN用默认编码写的东西在Linux乱码,或在Linux(zh_CN.UTF-8时)写的东西在WIN下乱码.在A ...

  5. css(4)

    类选择器和id选择器都有父子选择器. 在css文件中国,有时候为了简化样式,可以把相同的样式拿出来放在一起. display:inline display:block 行内元素里只能放行内元素,而块内 ...

  6. linux应用之tomcat安装(centos)

    安装方式:源码安装 软件:apache-tomcat-7.0.29.tar.gz下载地址:http://tomcat.apache.org/download-70.cgi 安装前提 系统必须已经安装配 ...

  7. 微软面试题:鸡蛋从第N层及以上的楼层落下会摔破

    from:https://blog.csdn.net/qq_18425655/article/details/52326709   题目: 有一栋楼共100层,一个鸡蛋从第N层及以上的楼层落下来会摔破 ...

  8. django 模板中通过变量替代key取字典内容

    模板中通过变量替代key取字典内容 templatetags/├── get_item.py├── __init__.py ###get_item.py # coding=utf-8 from dja ...

  9. bzoj 4453 cys就是要拿英魂! —— 后缀数组+单调栈+set

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4453 这种问题...一般先把询问离线,排序: 区间对后缀排名的影响在于一些排名大而位置靠后的 ...

  10. 利用正则表达式类解析SQL语句,达到Worklist兼容各个RIS数据库的目的

    在做RIS的项目中遇到一个问题, 因为Worklist要兼容各个RIS数据库, 因此设计了目前这个架构. 1.xml文件来配置RIS数据库的数据源, 2.xml文件来存储关于查询/更新数据库的SQL语 ...