CodeForces---787D:Legacy【线段树优化建图+最短路】

该博客介绍了如何解决CodeForces上的787D问题,涉及到线段树优化建图和最短路算法的应用。通过建立两棵线段树分别表示出度和入度,并利用线段树的特性减少区间建边的时间复杂度,最终使用Dijkstra算法求解起点到其他点的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

戳这里啊~~~

题意:

给你三种操作:(1)点到点建边;(2)点到区间建边;(3)区间到点建边;最后求起点到其他点的最短距离

分析:

最短距离无非建边跑Dijkstra即可,考虑如何对区间建边,如果直接对区间的每一点建边,那N^2的复杂度是行不通的,考虑将区间映射到线段树上的一个点:

(1)建两颗线段树,一颗表示出度的点,一颗表示入度的点

(2)对于表示出度的树,对每一节点和它父亲节点连一条长度为0的单向边(如果能从父亲出发,那么儿子也一定能);对于表示入度的树,对每一节点和它的儿子节点连一条长度为0的单向边(如果能到达父亲,那么也一定能达到儿子),并将其叶子节点和第一颗树对应的节点连一条长度为0的单向边(相当于从到达的点又出发),完全可以只建一颗树,但这样会走很多无用的边

(3)为了能区别两颗树,就必须给两颗树从新编号,建边时,直接找到对应的编号建边即可

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long LL;
const int maxn = 2e5+15;
const LL inf = 1e18;
inline int read() {
    int x = 0, f = 1;
    char c = getchar();
    for (; !isdigit(c); c = getchar()) if (c == '-') f = -1;
    for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
    return x * f;
}
inline void write(LL x)
{
     if(x<0) putchar('-'),x=-x;
     if(x&g
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值