题解 CF786B 【Legacy】】的更多相关文章

前言 题目链接 题意 有 \(n\) 个点,\(q\) 次连边,以及起点 \(s\) .连边具体分三种: \(1\) \(v\) \(u\) \(w\) 从 \(v\) 到 \(u\) 连一条边. \(2\) \(v\) \(l\) \(r\) \(w\) 从 \(v\) 向 \(l\) 到 \(r\) 所有点连一条边. \(3\) \(v\) \(l\) \(r\) \(w\) 从 \(l\) 到 \(r\) 所有点向 \(v\) 连一条边. 求所有点的最短路. 思路 以前做过一道比较类似的题…
模板题CF786B Legacy 先说算法 如果需要有n个点需要建图 给m个需要建边的信息,从单点(或区间内所有点)向一区间所有点连边 如果暴力建图复杂度\(mn^2\) 以单点连向区间为例,在n个点上建一颗线段树,叶子节点即为这n个点,每个节点向它的左右儿子连一个权值为0的边,这样我们只要向一个节点连边,也就相当于向它所在的区间每个点都连边了(因为连到这个节点,就能顺着线段树中0边权的路一路走到叶子节点,也就是真正存在的节点) 这样可以用类似与线段树区间查找的方法,以\(logn\)的复杂度向…
线段树优化连边 要求点 \(x\) 向区间 \([L, R]\) 连边, 一次的复杂度上限为 \(O(n)\) 然后弄成线段树的结构 先父子连边边权为 \(0\) 这样连边就只需要连父亲就可以等效于连了区间内每个点 空间复杂度为线段树大小, 一次区间连边时间复杂度为 \(O(\log n)\) 这是连入边, 连出边的话反向建线段树内边即可 CF786B Legacy 默认情况下他不能用这把枪开启任何传送门.在网络上有q个售卖这些传送枪的使用方案.每一次你想要实施这个方案时你都可以购买它,但是每次…
本题要求我们支持三种操作: ① 点向点连边. ② 点向区间连边. ③ 区间向点连边. 然后跑最短路得出答案. 考虑使用线段树优化建图. 建两颗线段树,入树和出树,每个节点为一段区间的原节点集合.入树内部为儿子向父亲连有向边,出树内部为父亲连有向边,因为入树和出树的叶子节点都为原图中的点,所以两棵树的对应叶子节点连无向边,这些边边权都为\(0\). 示意图如下,左边为入树,右边为出树. 操作一时,从入树叶子节点向出树叶子节点连边(红色的线). 操作二时,从入树叶子节点向出树所对应的区间节点连边(蓝…
问题描述 CF786B LG-CF786B 题解 线段树优化建图 线段树的一个区间结点代表 \([l,r]\) 区间点. 然后建立区间点的时候就在线段树上建边,有效减少点的个数,从而提高时空效率. 优质题解传送门 \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; #define int long long template <typename Tp> void read(Tp &x){ x=0;ch…
题面:786B - Legacy 代码: #include<cstdio> #include<cstring> #include<iostream> #include<queue> #define ll long long using namespace std; inline ll rd(){ ll x=,f=;char c=getchar(); ; c=getchar();} +c-'; c=getchar();} return f*x; } ,maxq…
CodeForces 786B Rick和他的同事们做出了一种新的带放射性的婴儿食品(???根据图片和原文的确如此...),与此同时很多坏人正追赶着他们.因此Rick想在坏人们捉到他之前把他的遗产留给Morty. 在宇宙中一共有n个星球标号为1到n.Rick现在身处于标号为s的星球(地球)但是他不知道Morty在哪里.众所周知,Rick有一个传送枪,他用这把枪可以制造出一个从他所在的星球通往其他星球(也包括自己所在的星球)的单行道路.但是由于他还在用免费版,因此这把枪的使用是有限制的. 默认情况…
嘟嘟嘟 省选Day1T2不仅考了字符串,还考了线段树优化建图.当时不会,现在赶快学一下. 线段树能优化的图就是像这道题一样,一个点像一个区间的点连边,或一个区间像一个点连边.一个个连就是\(O(n ^ 2)\)复杂度了,当然承受不起.于是就有了线段树了. 原理很简单,就是把一个连续区间的点合并成线段树上的一个点,这样最多有\(nlogn\)个点.但仅仅这样还不对,所以我们要建两棵树,一个是入度树,一个是出度树. 对于入度树,每一个点要像左右儿子连边,因为如果这个有人像这个点所代表的区间连边,那么…
思路 线段树优化建图 基本思想就是要把一个区间连边拆成log个节点连边, 然后一颗入线段树,一颗出线段树,出线段树都由子节点向父节点连边(可以从子区间出发),入线段树从父节点向子节点连边(可以到达子区间),入线段树上每个节点向出线段树的每个对应节点连边(进来之后可以出去),题目里的边由出线段树连向入线段树 然后最短路就好了 代码 #include <cstdio> #include <algorithm> #include <cstring> #include <…
题目大意:初始给定 N 个点,支持三种操作:两点之间连边:一个点与一个连续区间编号的点之间连边:一个连续区间内的点和一个点连边,求执行 N 次操作之后的单源最短路. 题解:学会了线段树优化建图. 发现若暴力进行连边,时间和空间都会被卡到 \(O(n^2)\),直接起飞. 发现连边的点的编号是连续的,结合线段树可以维护连续区间信息的思想,就产生了线段树优化建图的方法. 在初始的 N 个节点的基础上建立两棵线段树,分别表示入树和出树,其中入树的上的各个节点允许单个节点的连接:出树上的节点允许连接单个…