车站分级 (线段树优化建边 拓扑序最长路)

车站分级问题通过线段树优化,将边数从2*n减少到O(m*log(n)),降低建边复杂度。在拓扑排序中寻找最长路径,线段树在解决这个问题中展现出了高效的应用。
摘要由CSDN通过智能技术生成

车站分级(加强版)

10.11

思路:
基本方法就是等级高的车站向等级低的车站连边,最后跑拓扑序的最长路就是ans。
线段树优化建边的拓扑排序(线段树的神奇应用)。
先是建虚点优化,边数优化为2*n,但是发现建边的复杂度是nm,考虑线段树优化。
注意到经停站把车站序列划分成了多个区间,每个区间对应O(log)个线段树上的节点,因此连边时可以把边数由O(nm)优化到O(m*log(n))。线段树中的上下层节点先连好边,区间整体连边的时候直接把线段树上零散的块连在虚点上即可。具体细节可以参考代码。

#include <cstdio>
#include <queue>
#include <algorithm>
#define N 400010
using namespace std;

struct Edge{
    int to, nxt;
}ed[N * 20];

queue <int> q;

struct node{
    int id;
    node *ls, *rs;
}pool[N * 20], *tail = pool, *root;

int n, m, idc=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值