题解 AT5635 Shortest Path on a Line(线段树优化建图)

upd on 2022.9.3:增加了对解法的描述。

Description

有一张有 (N) 个点,编号为 (1 – N) 的无向图。

做 (M) 次操作,每次操作给出三个正整数 (L,R,C),对于每对 (≥L) 且 (≤R) 的整数对 ((S,T)) ,在 ((S,T)) 之间添加一条长度为 (C) 的边

完成操作后,找出操作后无向图的最短路。

  • $ N,M\ \leq\ 10^5 $

Solution

线段树优化建图裸题。

看到区间向区间连边,显然暴力处理是 (O(MN)) 的,会时间超限。

那么可以想到处理区间问题的常用工具:线段树。

我们对整个区间建立线段树,把每个点分为入点和出点,构建出入树和出树。

在实现上述过程的时候,我们其实只要建一遍线段树。对于叶子结点,我们可以让两棵树共用,就不必再连边了。

那么对于一个点向一个区间连边,我们可以将其转化为这个点和区间在入树上分成的若干子区间对应的节点连边。

区间向点连边同理,将出树上该区间分成的子区间分别向这个点连边。

题目要求我们区间向区间连边,这个时候我们可以新建一个节点,将出树区间向这个节点连边,这个点再向入树区间连边,就可以了。

然后剩下的就是在建好的图上跑最短路板子,我用的堆优化的 Dijkstra,就不赘述了。

细节可以看代码注释。

Code

#include
#define gc() getchar()
using namespace std;
typedef long long ll;

template  void rd(T &x){
    T f=1;x=0;char c=gc();
    for(;!isdigit(c);c=gc())if(c=='-')f=-1;
    for(;isdigit(c);c=gc())x=(x<>1;
    in[o]=++tot,out[o]=++tot;// 存储 o 代表的区间对应的图中节点
    build(o<=l&&t[o].r>1;
    // 递归加边
    if(lmid)addedge(o<a.w;}
};
priority_queueq;
inline void dij(){
    memset(d,0x3f,sizeof(d));
    d[1]=0;q.push(pq(1,0));
    while(!q.empty()){
        pq x=q.top();q.pop();
        int u=x.v;if(vis[u])continue;
        vis[u]=1;
        for(int i=hd[u];i;i=g[i].nxt){
            int v=g[i].v,w=g[i].w;
            if(d[v]>d[u]+w)d[v]=d[u]+w,q.push(pq(v,d[v]));
        }
    }
}

int main(){
    //freopen(".in","r",stdin);
    //freopen(".out","w",stdout);
    rd(n),rd(m);tot=n;// tot 从 n 开始,避免与叶子节点重复
    build(1,1,n);// 别忘了建树
    for(int i=1;i

(by\ sysong)

(2022.8.30)

Original: https://www.cnblogs.com/sysong2006/p/16641279.html
Author: _sysong
Title: 题解 AT5635 Shortest Path on a Line(线段树优化建图)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/587549/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数组模拟(一)

    写在前面 近期的学习重点要放在图论了,之前一直在acwing中学习的数据结构都是数组模拟,数组模拟的效率比上stl要快上几倍,学完过后不久就会忘记,但是忘记也是一种学习,原本准备放…

    数据结构和算法 2023年6月7日
    070
  • Win10显示连上网络却无网

    连上了以太网,图标也显示有网,但就是无网。 原因:走了代理(e.g., clash for windows),然后没有正常退出。所以一直出现没网络的情况。 解决方案:打开代理软件,…

    数据结构和算法 2023年6月8日
    099
  • CF1468H K and Medians 题解

    每次删数都会删恰好 (k-1) 个,所以删的数总个数必须是 (k-1) 的倍数。考虑最终状态,如果所有数左边不足 (\frac{k-1}{2}) 个删掉的数或右边不足 (\frac…

    数据结构和算法 2023年6月12日
    072
  • 2006NOIP普及组:明明的随机数

    明明的随机数 时间限制:1000ms 内存限制:65536KB 题目描述: 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随…

    数据结构和算法 2023年6月8日
    093
  • synchronized原理剖析

    synchronized原理剖析 并发编程存在什么问题? 1️⃣ 可见性 可见性:是指当一个线程对共享变量进行了修改,那么另外的线程可以立即看到修改后的最新值。 案例演示:一个线程…

    数据结构和算法 2023年6月8日
    087
  • Vector源码解读

    阅读源码是提高编程技能的有效方式… 面试中也经常问到源码相关的问题….. 在解读Vector时大家可以先解读ArrayList,因为这个两个的逻辑几乎是一样…

    数据结构和算法 2023年6月12日
    081
  • 算法:两个链表的第一个公共节点

    问题 输入两个链表,找出它们的第一个公共节点。 解决 //1、暴力解法 class Solution { ListNode getIntersectionNode(ListNode…

    数据结构和算法 2023年6月12日
    075
  • P2634 [国家集训队]聪聪可可

    简要题意 给你一个 (n) 各节点的树,每一个边有一个权值。你需要求出树上任意两个的点之间的简单路径权值和(相同的点结果是 (0))是 (3) 的倍数的概率。输出概率的最简分数形式…

    数据结构和算法 2023年6月12日
    085
  • Java知识点总结——IO流框架

    IO框架 一、流的概念 概念:内存与存储设备之间传输数据的通道。 二、流的分类 按方向分类: 输入流:将 输出流:将 内存:内存是一种用于暂时存放[CPU]中的运算数据和外部储存器…

    数据结构和算法 2023年6月7日
    099
  • 数据库索引的基石—-B树

    数据结构相对来说比较枯燥, 我尽量用最易懂的话,来把B树讲清楚。学过数据结构的人都接触过一个概念—-二叉树。简单来说,就是每个父节点最多有两个子节点。为了在二叉树上更快…

    数据结构和算法 2023年6月8日
    081
  • 简易计算器,组合 + 内部类回顾

    输入框监听事件 package GUI; import java.awt.*; import java.awt.event.ActionEvent; import java.awt…

    数据结构和算法 2023年6月7日
    087
  • ABC 267 F Exactly K Steps(树的直径,LCA倍增)

    题目: ​ 给出一棵n个点的树,边权为1,进行2e5次询问,每次输出 任意一个离结点(u)距离为(k)的结点。 思路: ​ 对于树上问题,我们的武器不多,而且时间复杂度为O(log…

    数据结构和算法 2023年6月12日
    085
  • oj在线判题程序设计竞赛c++小技巧

    最近在做oj题目狂补数据结构和算法(doge) 其中涉及到很多之前学习c++的时候不知道的一些《奇技淫巧》,持续更新ing 1.每次都需要添加很多c++的库文件??? 你可以尝试&…

    数据结构和算法 2023年6月7日
    090
  • The 19th Zhejiang Provincial Collegiate Programming Contest

    A.JB Loves Math B.JB Loves Comma C. JB Wants to Earn Big Money G. Easy Glide I. Barbecue L…

    数据结构和算法 2023年6月12日
    097
  • [总结]2022/1/20

    P1心路历程 开题12min看完题目,认为T2、T4是大模拟,T1是一个dp之类的东西,T3看到想到了宽搜。认为T2好做一点,于是开始干T2。认为自己的想法是对的,写了一个跑不满 …

    数据结构和算法 2023年6月8日
    088
  • B. Build the Permutation

    题目分析:我们先简单的分析一下这道题是在干什么啊,给我们三个整数n,a,b,问我们能否构造这样的排列使得序列中有a个极大值,b个极小值,能的话就给出任意一种可能的情况,不能的话就输…

    数据结构和算法 2023年6月7日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球