「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→cj​j

求到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(nlog⁡n)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最短路)相关推荐

  1. 【LOJ3272】「JOISC 2020 Day1」汉堡肉

    题目链接 点击打开链接 题目解法 考虑问题在一维上的形式,显然,我们会希望所选的最靠左侧的点尽量靠右. 因此,选择 min ⁡ { R i } \min\{R_i\} min{Ri​} 是不劣的,我们 ...

  2. 「JOISC 2014 Day4」挂饰(背包DP)题解

    题目翻译 JOI 君有 n n n 个装在手机上的挂饰,编号为 1 - n 1 \ldots n 1-n. JOI 君可以将其中一些挂饰装在手机上. JOI 君的挂饰有一些与众不同--其中的一些挂饰附 ...

  3. 「雅礼集训」市场--势能线段树

    题目链接: https://loj.ac/p/6029 题意: 思路: 势能时间分析: 每次除数至少为2,所以一个数最多除log次,log次操作后一个区间就会相等,加法又需要log次使区间相等,所以使 ...

  4. 「JOISC 2014 Day3」稻草人

    「JOISC 2014 Day3」稻草人 问题简述 解析 代码 问题简述 链接 https://loj.ac/problem/2880   给定 n n n个稻草人(横纵坐标是不大于 1 0 9 10 ...

  5. 【LOJ】#3030. 「JOISC 2019 Day1」考试

    LOJ#3030. 「JOISC 2019 Day1」考试 看起来求一个奇怪图形(两条和坐标轴平行的线被切掉了一个角)内包括的点个数 too naive! 首先熟练的转化求不被这个图形包含的个数 -- ...

  6. 「JOISC 2014 Day1」巴士走读

    「JOISC 2014 Day1」巴士走读 题解部分: (如果不怎么喜欢看推导的人可以直接看下面的关键部分,在段尾会有标注(或者看完定义直接看代码)) 本题让我们求到达点n需要最晚何时到达点1,我们可 ...

  7. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

  8. 洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]

    P2826 [USACO08NOV]光开关Light Switching 题目描述 Farmer John tries to keep the cows sharp by letting them p ...

  9. 洛谷P2073 送花 [2017年6月计划 线段树01]

    P2073 送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花 ...

最新文章

  1. mysql 修复_mysql修复表的三个方法
  2. MySQL修改用户(RENAME USER)
  3. matlab 行 读取文件 跳过_用Matlab处理LAS点云(1)——LAS文件概述
  4. 数据库复习之规范化理论应用(第八次上机内容)
  5. Restful API 中的错误处理方案
  6. 今晚8点直播丨经典知识库:数据库对象命名设计规范手册
  7. html5 开发工具_前端HTML5开发工具有哪些呢?
  8. 【linux】Linux cp命令拷贝 不覆盖原有的文件
  9. pytorch ner
  10. 用汇编的眼光看C++(之class构造、析构)
  11. OpenAI Gym 是一个优秀开发和比较强化学习算法的工具
  12. Mysql 中将blob类型转换成varchar类型
  13. 软件开发所需要的十三个文档
  14. 教你如何搜索公众号中的文章
  15. (PMIC)全、半桥驱动器CSD95481RWJ PDF 规格
  16. 华杉讲透《孙子兵法》阅读有感(一)
  17. 深入剖析eMule 【for_wind】
  18. Visitor(访问者)设计模式
  19. ThinkPad开机停留在boot menu界面、进不了系统的解决方法
  20. Excel表格中第一个输入的零不显示怎么办?

热门文章

  1. 当Java、C++、Python等编程语言都变成妹子。。。
  2. sklearn集合算法预测泰坦尼克号幸存者
  3. 《SAS编程与数据挖掘商业案例》学习笔记之十一
  4. java线程死锁 cpu 100%_一文学会Java死锁和CPU 100% 问题的排查技巧
  5. linux 修复图形界面,图形界面操作的备份和恢复Linux发行版
  6. 无源的nfc加传感_基于ON Semiconductor SPS无源温度标签,应用于冷链运输的 UHF 标签读取器方案...
  7. linux基础 linhaifeng,Linux基础之命令练习Day2(示例代码)
  8. 服务器自动删文件,服务器定时删除文件工具
  9. java 位运算_java学习之运算符与表达式(四)
  10. 乐视android版本点四下,EUI5.9+Android7.0刷机包