题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073 建两棵线段树,一棵从下往上连边,一棵从上往下连边,叶子节点之间也有连边: 区间向区间连边时,可以新建一个节点,log2n 条边就能变成 2logn 条边: 注意区间向区间连边也要连反边,别忘了连反边时 ++cnt ! 代码如下: #include<iostream> #include<cstdio> #include<cstring> #include<…
[#3073. Pa2011]Journeys (线段树优化连边) 这张图太直观了,直接讲透了线段树优化连边的原理和正确性. 考虑建立两颗线段树,一颗是外向树,一颗是内向树,相当于网络流建模一样,我们可以利用这两颗线段树分别模拟一个点的入度和出度.毕竟一个点如果确定了它的入度和出度就相当于确定了在图中的位置. 外向树 一条边进入了一个父亲节点,相当于能进入它所有的儿子,这就模拟了入度.这和线段树很像,于是我们就做成线段树的样子,每次加边的时候,最多从外向树选出\(O(\log n)​\)的节点,…
题目描述 Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路.Seter保证不会有一个国家与自己之间有道路. Seter好不容易建好了所有道路,他现在在位于P号的首都.Seter想知道P号国家到任意一个国家最少需要经过几条道路.当然,Se…
3073: [Pa2011]Journeys Time Limit: 20 Sec  Memory Limit: 512 MB Description     Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路.Seter保证一条道路不会…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3073 建两棵线段树,一棵孩子向父亲连边,是走出去的:一棵父亲向孩子连边,是走进来的. 注意第二棵线段树的叶子向第一棵线段树的叶子连边. 在树上节点间连边的时候,不是 log^2 地直接连,而要新建一个节点作中转点,这样边数就是 2*log 的:连向中转点和连出去的边一部是0一部是1或者全是0.5即可. 注意连无向边.两种方向当然是两个中转点. 边数 3e7 似乎还是小.但能过.更大就开不下…
题意 \(n\)个点的无向图,构造\(m\)次边,求\(p\)到任意点的最短路. 每次给出\(a, b, c, d\) 对于任意\((x_{a \leqslant x \leqslant b}, y_{c \leqslant y \leqslant d})\)连边 Sol 暴力建图的话边数为\(O(MN^2)\) 考虑一种优化. \(link(a, b, x)\)表示在\((a, b)\)之间连权值为\(x\)的边 设置虚点\(p_1, p_2\), \(link(i_{a \leqslant…
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在\([l_i,r_i]\)中的点所有点连\(INF\)边. 但是\(O(n^2)\)条边显然要GG.容易想到用线段树优化. 每次都是向前缀所有的点连边,所以可以离散化后用可持久化线段树连边. 另外其实也不需要拆点,直接连即可. //15336kb 500ms #include <cstdio> #…
[BZOJ3073][Pa2011]Journeys Description Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路.N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路.Seter保证一条道路不会修建两次,也保证不会有一个国家与自己之间有道路. Seter好不容易建好了所有道路…
https://www.lydsy.com/JudgeOnline/problem.php?id=5017 暴力: 对于每一个炸弹,枚举所有的炸弹,看它爆炸能不能引爆那个炸弹 如果能,由这个炸弹向引爆的炸弹连单向边 tarjan所点后拓扑排序 在拓扑图上倒着统计答案 可以得到一个炸弹能引爆的编号最小mi和最大的炸弹mx,mx-mi+1就是先引爆这个炸弹一共能引爆的炸弹数 优化: 一个炸弹一定是向一段区间连边 所以用线段树优化,这样向一个区间连边就变成了向一个点连边 注意存边的空间一定要开的足够大…
我们预处理出来以i为结尾的最长回文后缀(回文自动机的构建过程中就可以求出)然后就是一个区间覆盖,因为我懒得写贪心,就写了线段树优化的DP. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N=101010; const int INF=1e9; int L…