题意:

有一条起点为0,长度为L的跑道,有n个跳板,对于第i个跳板,在xi处开始起跳,但是必须在xi-pi ~ xi进行缓冲时间为pi,然后在ti的时间到达xi+di处,人可以往回走,但是跳板的方向是固定的,然后求出到达L的最短时间,并且按照起跳顺序的先后输出用了的跳板的编号。

题解:

首先需要明白的是,给出的xi这个点是无用的,那么有用的点只有xi - pi 和 xi + di。

并且转移情况复杂,包括往回走的情况,包括选跳板的情况,不选跳板的情况,走路的情况,当时一时想不出好的解决方法,但是最后发现这不是最短路么?

考虑选择跳板的情况,将跳板的左右端点连一条单向边,权值为pi + ti

考虑不选跳板的情况,将一个点与其他所有点连一条双向边,权值为距离之差,但是发现有很多边都是无用,所以只需要将左右相邻的点相连就好了。

P.S. 数据太大需要离散QAQ,还有SPFA要被卡,会T在第50组,SXBK!

代码:

#include <bits/stdc++.h>
using namespace std;#define ll long long
const ll inf = 1e15 + 7;
const int N = 1e6 + 7;
struct edge {int u, v, nxt, w, id;}e[N<<2];
struct node {int s, t, w;} rd[N];int inq[N], disc[N<<1], dis[N], dcnt, head[N], ecnt, n, L, ans[N], cnt, pre[N];typedef pair <int, int> pii;
#define MK(a,b) make_pair(a, b)priority_queue <pii, vector <pii>, greater<pii> > q;void adde (int u, int v, int w, int id) {e[ecnt].u = u;e[ecnt].v = v;e[ecnt].w = w;e[ecnt].id = id;e[ecnt].nxt = head[u];head[u] = ecnt++;
}void Dijkstra () {memset (dis, 127, sizeof dis);pre[1] = -1;dis[1] = 0;q.push(MK(0, 1));while (!q.empty()) {int u = q.top().second;q.pop(); inq[u] = 0;for (int it = head[u]; it != -1; it = e[it].nxt) {int v = e[it].v;if (dis[v] > dis[u] + e[it].w) {dis[v] = dis[u] + e[it].w;pre[v] = it;q.push(MK(dis[v], v));}}}for (int it = pre[dcnt]; it != -1; it = pre[e[it].u])if (e[it].id != -1) ans[++cnt] = e[it].id;
}int main () {scanf ("%d%d", &n, &L);memset (head, -1, sizeof head);disc[++dcnt] = 0;disc[++dcnt] = L;for (int i = 1; i <= n ; ++i) {int x, d, t, p;scanf ("%d%d%d%d", &x, &d, &t, &p);rd[i].s = x - p;rd[i].t = x + d;rd[i].w = t + p;if (x - p < 0 || x + d > L) continue;disc[++dcnt] = x - p;disc[++dcnt] = x + d;}sort (disc + 1, disc + 1 + dcnt);dcnt = unique (disc + 1, disc + 1 + dcnt) - disc - 1;for (int i = 1; i <= n; ++i) {if (rd[i].t > L || rd[i].s < 0) continue;int s = lower_bound (disc + 1, disc + 1 + dcnt, rd[i].s) - disc;int t = lower_bound (disc + 1, disc + 1 + dcnt, rd[i].t) - disc;adde (s, t, rd[i].w, i);}for (int i = 2; i <= dcnt; ++i) {int s = i - 1, t = i, w = disc[t] - disc[s];adde (s, t, w, -1);adde (t, s, w, -1);}Dijkstra();cout << dis[dcnt] << endl << cnt << endl;for (int i = cnt; i >= 1; --i) printf ("%d ", ans[i]);return 0;
}

  

总结:

复杂的转移关系,简单的限制条件,就可以考虑图论QAQ

转载于:https://www.cnblogs.com/xgtao/p/5988090.html

codeforces 141D Take-off Ramps相关推荐

  1. 【codeforce 141D】Take-off Ramps 最短路问题

    其实本人觉得这道题最大的考点是题意(理解了半小时)外加各种坑,因为太过复杂,解释题意我想会写好多字就不写了,谷歌翻译.思路很简单,把每一个跳板的起点和终点作为一个中转点,离散化以后建边,首先和前后建边 ...

  2. Codeforces Round #101 (Div. 2)

    C.Queue(模拟) C.Queue(模拟) TimeLimit:2000MSMemoryLimit:262144KB Time\quad Limit:2000MS\quad Memory\quad ...

  3. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  4. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  5. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  6. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  7. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  8. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  9. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

最新文章

  1. 详解vue 路由跳转四种方式 (带参数)
  2. 老大吩咐的可重入分布式锁,终于完美的实现了~
  3. 为什么CNN模型要使用很多小的卷积核,比如3x3,而不是7x7或者9x9呢?
  4. 【STSRM13】绵津见
  5. 在web前端调用后台java程序(java类)的方式
  6. HDU 5781 ATM Mechine(概率dp)
  7. html计算选定的金额,计算总金额
  8. 如何用python做俄罗斯方块_你的童年有俄罗斯方块吗?教你用 Python 实现俄罗斯方块!...
  9. 2020腾讯软件测试实习面经
  10. 【题解】LuoGu4654:[CEOI2017]Mousetrap
  11. 验证苹果手机正品新机
  12. 远程桌面--外网访问内网多台电脑
  13. CSS box-shadow 详解
  14. linux ubantu snmp服务,ubuntu 20.04 snmp安装配置
  15. 创成汇:科技与艺术概念结合在手机上,效果居然这么强?_创成汇
  16. Android fastboot 基本操作命令(Android 刷机)
  17. 基于行为识别和视频分类的算法
  18. M.2、PCIe、mSATA接口的SSD 速度性能如何?哪一个是装机首选
  19. 语音朗读模块TTS文本变量实时转语音朗读科大讯飞XFS5152CE芯片AI
  20. mysql db 100万行 大小_插入100万行数据

热门文章

  1. 量子计算机相同数字相加怎么算,量子计算机如何分解两个质数乘积
  2. 视频软件Vegas的项目工程文件打不开怎么办?
  3. 项目经理用一个计算机模型估算成本,PMP每日一练
  4. Tomcat更换端口号部署多项目
  5. mysql字段约束_mysql数据库之表操作及字段约束条件
  6. Coursera视频打不开终极办法
  7. java 透传_透明传输 - javaadu - 博客园
  8. 信息系统集成及服务管理(ITSS)和审计要点
  9. Tvori推出2.0版本,让VR动画制作更简单
  10. 23三种设计模式详解