「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)
「JOISC 2020 Day4」治疗计划
description
solution
设dpi:1−Ridp_i:1-R_idpi:1−Ri 都能被救治成功的最小花费
两个治疗方案[Li,Ri],[Lj,Rj][L_i,R_i],[L_j,R_j][Li,Ri],[Lj,Rj]能够合并成完整的健康区间的条件为Ri−Lj+1≥∣Ti−Tj∣R_i-Lj+1\ge |T_i-T_j|Ri−Lj+1≥∣Ti−Tj∣
最后要合并成[1,n][1,n][1,n]
相当于如果从Li=1L_i=1Li=1的所有方案出发,如果能与jjj方案合并,则连边i→cjji\rightarrow^{c_j} ji→cjj
求到Rj=nR_j=nRj=n的最短路
Ti≥TjT_i\ge T_jTi≥Tj
Ri−Lj+1≥Ti−Tj⇔Ri−Ti+1≥Lj−TjR_i-L_j+1\ge T_i-T_j\Leftrightarrow R_i-T_i+1\ge L_j-T_jRi−Lj+1≥Ti−Tj⇔Ri−Ti+1≥Lj−Tj
Ti<TjT_i<T_jTi<Tj
Ri−Lj+1≥Tj−Tj⇔Ri+Ti+1≥Lj+TjR_i-L_j+1\ge T_j-T_j\Leftrightarrow R_i+T_i+1\ge L_j+T_jRi−Lj+1≥Tj−Tj⇔Ri+Ti+1≥Lj+Tj
以TjT_jTj为下标建线段树,维护两棵线段树
最短路用dijkstra
跑,线段树可以查找出所有iii的出边点
因为每个点的花费是一定的,所以一定是当前最短路拓展到该点且仅一次
所以每个点只会被用一次(用了就可以删掉了)
O(nlogn)O(n\log n)O(nlogn)
code
#include <queue>
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
#define inf 0x7f7f7f7f
#define int long long
#define maxn 100005
struct node {int t, l, r, c;
}cure[maxn];
vector < int > nxt;
priority_queue < pair < int, int > > q;
int n, m;
int dis[maxn];bool cmp( node x, node y ) {return x.t < y.t;
}class SegMentTree {private :int t[maxn << 2];public :void build( int num, int l, int r, int k ) {if( l == r ) {t[num] = cure[l].l + k * cure[l].t;return;}int mid = ( l + r ) >> 1;build( num << 1, l, mid, k );build( num << 1 | 1, mid + 1, r, k );t[num] = min( t[num << 1], t[num << 1 | 1] );}void modify( int num, int l, int r, int pos ) {if( l == r ) {t[num] = inf;return;}int mid = ( l + r ) >> 1;if( pos <= mid ) modify( num << 1, l, mid, pos );else modify( num << 1 | 1, mid + 1, r, pos );t[num] = min( t[num << 1], t[num << 1 | 1] );}void query( int num, int l, int r, int L, int R, int k ) {if( L > R || R < l || r < L || t[num] > k ) return;if( l == r ) {nxt.push_back( l );return;}int mid = ( l + r ) >> 1;query( num << 1, l, mid, L, R, k );query( num << 1 | 1, mid + 1, r, L, R, k );}
}S, T;
signed main() {scanf( "%lld %lld", &n, &m );for( int i = 1;i <= m;i ++ )scanf( "%lld %lld %lld %lld", &cure[i].t, &cure[i].l, &cure[i].r, &cure[i].c );sort( cure + 1, cure + m + 1, cmp );S.build( 1, 1, m, -1 );T.build( 1, 1, m, 1 );for( int i = 1;i <= m;i ++ )if( cure[i].l == 1 ) {dis[i] = cure[i].c;q.push( make_pair( -dis[i], i ) );S.modify( 1, 1, m, i );T.modify( 1, 1, m, i );}while( ! q.empty() ) {int u = q.top().second; q.pop();if( cure[u].r == n ) return ! printf( "%lld\n", dis[u] );nxt.clear();S.query( 1, 1, m, 1, u - 1, cure[u].r - cure[u].t + 1 );T.query( 1, 1, m, u + 1, m, cure[u].r + cure[u].t + 1 );for( int i = 0;i < nxt.size();i ++ ) {int v = nxt[i];dis[v] = dis[u] + cure[v].c;q.push( make_pair( -dis[v], v ) );S.modify( 1, 1, m, v );T.modify( 1, 1, m, v );}}printf( "-1\n" );return 0;
}
「JOISC 2020 Day4」治疗计划(线段树+dijkstra最短路)相关推荐
- 【LOJ3272】「JOISC 2020 Day1」汉堡肉
题目链接 点击打开链接 题目解法 考虑问题在一维上的形式,显然,我们会希望所选的最靠左侧的点尽量靠右. 因此,选择 min { R i } \min\{R_i\} min{Ri} 是不劣的,我们 ...
- 「JOISC 2014 Day4」挂饰(背包DP)题解
题目翻译 JOI 君有 n n n 个装在手机上的挂饰,编号为 1 - n 1 \ldots n 1-n. JOI 君可以将其中一些挂饰装在手机上. JOI 君的挂饰有一些与众不同--其中的一些挂饰附 ...
- 「雅礼集训」市场--势能线段树
题目链接: https://loj.ac/p/6029 题意: 思路: 势能时间分析: 每次除数至少为2,所以一个数最多除log次,log次操作后一个区间就会相等,加法又需要log次使区间相等,所以使 ...
- 「JOISC 2014 Day3」稻草人
「JOISC 2014 Day3」稻草人 问题简述 解析 代码 问题简述 链接 https://loj.ac/problem/2880 给定 n n n个稻草人(横纵坐标是不大于 1 0 9 10 ...
- 【LOJ】#3030. 「JOISC 2019 Day1」考试
LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...
- 「JOISC 2014 Day1」巴士走读
「JOISC 2014 Day1」巴士走读 题解部分: (如果不怎么喜欢看推导的人可以直接看下面的关键部分,在段尾会有标注(或者看完定义直接看代码)) 本题让我们求到达点n需要最晚何时到达点1,我们可 ...
- LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)
题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...
- 洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]
P2826 [USACO08NOV]光开关Light Switching 题目描述 Farmer John tries to keep the cows sharp by letting them p ...
- 洛谷P2073 送花 [2017年6月计划 线段树01]
P2073 送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花 ...
最新文章
- mysql 修复_mysql修复表的三个方法
- MySQL修改用户(RENAME USER)
- matlab 行 读取文件 跳过_用Matlab处理LAS点云(1)——LAS文件概述
- 数据库复习之规范化理论应用(第八次上机内容)
- Restful API 中的错误处理方案
- 今晚8点直播丨经典知识库:数据库对象命名设计规范手册
- html5 开发工具_前端HTML5开发工具有哪些呢?
- 【linux】Linux cp命令拷贝 不覆盖原有的文件
- pytorch ner
- 用汇编的眼光看C++(之class构造、析构)
- OpenAI Gym 是一个优秀开发和比较强化学习算法的工具
- Mysql 中将blob类型转换成varchar类型
- 软件开发所需要的十三个文档
- 教你如何搜索公众号中的文章
- (PMIC)全、半桥驱动器CSD95481RWJ PDF 规格
- 华杉讲透《孙子兵法》阅读有感(一)
- 深入剖析eMule 【for_wind】
- Visitor(访问者)设计模式
- ThinkPad开机停留在boot menu界面、进不了系统的解决方法
- Excel表格中第一个输入的零不显示怎么办?
热门文章
- 当Java、C++、Python等编程语言都变成妹子。。。
- sklearn集合算法预测泰坦尼克号幸存者
- 《SAS编程与数据挖掘商业案例》学习笔记之十一
- java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧
- linux 修复图形界面,图形界面操作的备份和恢复Linux发行版
- 无源的nfc加传感_基于ON Semiconductor SPS无源温度标签,应用于冷链运输的 UHF 标签读取器方案...
- linux基础 linhaifeng,Linux基础之命令练习Day2(示例代码)
- 服务器自动删文件,服务器定时删除文件工具
- java 位运算_java学习之运算符与表达式(四)
- 乐视android版本点四下,EUI5.9+Android7.0刷机包