CF983E NN country(倍增,差分)】的更多相关文章

首先可以求出从某点做$2^k$次车能到的最浅的点,这个只要dfs一下,把它的孩子能到的最浅的点更新过来就可以 然后倍增地往上跳,不能跳到lca的上面,记录坐车的次数ans 此时有三种情况(设最远能跳到x,y): 1.再跳也跳不到lca的上面,就是-1 2.路径(x,y)被某趟车覆盖,答案是ans+1 3.并没有被覆盖,答案是ans+2 那么怎么看有没有覆盖呢 首先,如果这两个点是直上直下的(有一个是lca),只要看下面那个点能不能跳到上面去就行 对于剩下的(x,y),只要有车的两端点分别在x和y…
题意 给定一棵树和若干条路线,每条路线相当于树上 x,y 之间的路径,途径路径上的每个点 给出若干个询问,每次询问从 u 到 v 至少需要利用几条路线 N,M,Q≤200000 题解 构建倍增数组g[i][j]表示从i点向上经过j条线路能到达的深度最小的点. 所以对于每一对询问的x,y,我们贪心地把它们提到深度大于等于lca地最大的点.记为x‘,y'然后判断是否有路径经过x’和y‘ 然后各种情况特判(无解,x‘,y’为lca,有无路径经过x‘,y’) 然后对于判断是否路径经过x‘,y’. 可以用…
题意:给一棵树,有许多条巴士线路$(a_i,b_i)$(巴士在路径上每个点都会停车),多次询问从一点到另一点最少要坐多少次巴士 首先dfs一遍预处理出一个点向上坐$2^k$次巴士能到的最浅点,于是我们能很快地查询一个点往上走到另一个点最少要坐多少次巴士 对于询问$(u,v)$,我们肯定是贪心地坐车,每次坐尽可能远,路径是$u\rightarrow lca_{u,v}\rightarrow v$,我们找到$l_u$表示从$u$开始坐$a$次巴士能到的最浅点,并且再坐一次巴士就能到$lca_{u,v…
[题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组) 先从半链角度考虑.将每条给定链和每个询问拆成向上的一段和向下的一段.那么假设询问的半链最低端节点为x,贪心地选择x子树内向上延伸最远的给定半链(假设最高点为y),再从y继续贪心直至超过半链最顶端节点.再只考虑半链的前提下贪心显然正确. 但是我们注意到,这样贪心的复杂度是不正确的,因为如果每次只跳…
Description In the NN country, there are n cities, numbered from 1 to n, and n−1 roads, connecting them. There is a roads path between any two cities. There are m bidirectional bus routes between cities. Buses drive between two cities taking the shor…
Codeforces 题面传送门 & 洛谷题面传送门 一道(绝对)偏简单的 D1E,但是我怕自己过若干年(大雾)忘了自己的解法了,所以过来水篇题解( 首先考虑怎么暴力地解决这个问题,不难发现我们每一步肯定会贪心,贪心地跳到所有经过当前点的公交线路中另一端最浅的位置,直到到达两点的 \(\text{LCA}\) 为止.不难发现上述过程可以倍增优化,具体来说我们记 \(nxt_{i,j}\) 表示从 \(i\) 开始走 \(2^j\) 步最浅能够到达哪里,那么我们可以一面树剖求出经过每个点能够到达深…
原文链接https://www.cnblogs.com/zhouzhendong/p/9275606.html 题目传送门 - 洛谷P1600 题目传送门 - LOJ#2359 题目传送门 - Vijos P2004 题意 给定一个有 $n$ 个节点的树,每一个节点有一个观察员,编号为 $i$ 的节点上的观察员会在 $W_i$ 时刻出来观察. 现在有 $m$ 个热爱健身的人,其中第 $i$ 个从节点 $S_i$ 开始,到 $T_i$ 结束. 从时刻 $0$ 开始,每一个人同时以每秒一条边的速度沿…
BZOJ CodeVS Uoj 题目大意: 给一个n个点的边带权树,给定m条链,你可以选择树中的任意一条边,将它置为0,使得最长的链长最短. 题目分析: 最小化最大值,二分. 二分最短长度mid,将图中链长大于mid的链提取出来,求他们的交路径,选择他们都经过最大的一条边,看是否满足要求. 这是基本思路,下面来想想如何求解:一共尝试了两种办法: 倍增lca / 树链剖分lca + 树上差分: 求lca部分略过(本题用链剖较快),对于一条u->v的路径,在u处+1,v处+1,lca处-2,从下往上…
新鲜出炉! $n \leq 200000$的树,给$m \leq 200000$条链,$q \leq 200000$个询问,每次问一条询问链最少用m条中的几条给定链覆盖其所有边,可能无解. 首先确定一种贪心策略:$low_x$表示$x$能通过一条链跳到的最高的点(这里吐槽一下,题解描述时的树是反过来的,树根在地上!反人类啊,然后他后面所有的“高”“矮”描述全是反过来的!!!无良出题人),假设询问俩点$u,v$,lca即为$t$,那么先从$u$一直沿着$low$跳到$t$下面一点点,$v$一直沿着…
CF1039D You Are Given a Tree 容易发现,当 \(k\) 不断增大时,答案不断减小,且 \(k\) 的答案不超过 \(\lfloor\frac {n}{k}\rfloor\) ,因此不同的答案个数是 \(\sqrt n\) 级别的,可以用一种类似整体二分的方式求解. 对于一个 \(k\) ,从叶子节点贪心向上匹配即可得到答案. 点击查看代码 #include<bits/stdc++.h> using namespace std; int n; int ver[2000…