poj3471 - 倍增+LCA+树上差分】的更多相关文章

题意:一张n节点连通无向图,n-1条树边,m条非树边.若通过先删一条树边,再删一条非树边想操作 将此图划分为不连通的两部分,问有多少种方案. 利用LCA整好区间覆盖,dfs用来求前缀和 需要注意的是,覆盖数为1的时候才可以选择哦! 覆盖数为0,代表可以直接拆开 最后附上一张我老婆 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #define maxn 110…
[题目链接] [思路]: 根据题意可以明显看出,当所有任务都完成时的时间是最终的结果,也就是说本题要求,求出最小的最大值. 那这样的话就暗示了将答案二分,进行check. [check方法]: 如果说当前答案为ans,每个任务设为p[i],所花费的时间是p[i].tim,所有任务p[i].tim的最大值为maxdis 那么则将符合条件p[i].tim>=ans的数量num求出来,这个数量也就是符合条件的路径的数量(一个任务在u,v之间有一个简单路径很容易理解), 然后找到一个所有路径中他们的公共…
题目传送门 题目描述: N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多的是哪种物品. 输入格式: 第一行数字N,M接下来N-1行,每行两个数字a,b,表示a与b间有一条边再接下来M行,每行三个数字x,y,z如题 输出格式: . 样例: 样例输入: 20 508 610 618 620 107 202 1819 81 614 2016 1013 193 1417 1811 194 1115 145 1…
题目传送门 题意:定义$Tour \, Belt$为某张图上的一个满足以下条件的点集:①点集中至少有$2$个点②任意两点互相连通③图上两个端点都在这个点集中的边的权值的最小值严格大于图上只有一个端点在这个点集中的边的权值的最大值.现在给你一张$N$个点,$M$条边的图,请给出这张图上所有$Tour\,Belt$中包含的点数的和.$N \leq 5000 , M \leq \frac{N(N - 1)}{2}$ 虽然这道题没有必要用$Kruskal$重构树来写,但是考%你赛的时候写$Kruskal…
题目传送门 题目描述: 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀请小熊维尼前来参观,并且还指定一份参观指南,他希望维尼能够按照他的指南顺序,先去a1,再去a2,……,最后到an,去参观新家. 可是这样会导致维尼重复走很多房间,懒惰的维尼不听地推辞.可是松鼠告诉他,每走到一个房间,他就可以从房间拿一块糖果吃.维尼是个馋家伙,立马就答应了. 现在松鼠希望知道为了保证…
简要题意 树上n个节点,给定路径,求每个点经过次数 题意分析 对于每两个点,有两种情况,第一种,他们的lca为本身,第二种,他们有公共祖先,又要求他们的点经过次数,暴力是不可能的,复杂度不对,所以可以想到树上差分再求前缀和,在差分的过程中自然也要求lca了. 还有要注意的就是对于开始的起点和结束的终点是要特判经过的,其他的起点不计入次数. 树上差分 树上差分主要用于求解一些树上的路径问题 它通过利用树的一些性质,用一个差分数组来实现对一条路径的操作,这涉及到路径的 起,终点 与lca. 一般情况…
也许更好的阅读体验 \(\mathcal{Description}\) 原题链接 概括一下题意 给一颗有\(n\)个点带边权的树,有\(m\)个询问,每次询问\(u,v\)两点间的权值和,你可以将树中任意一条边的边权变为\(0\),问经过一次修改,这\(m\)个询问中最大的权值和最小可以是多少 \(\mathcal{Solution}\) 最大最小,显然二分 二分最小是多少,单调性显然 如何\(check\) 设当前二分到了\(x\),这\(m\)个询问中有\(tot\)个权值和大于\(x\)的…
题目描述 Farmer John has installed a new system of  pipes to transport milk between the  stalls in his barn (), conveniently numbered . Each pipe connects a pair of stalls, and all stalls are connected to each-other via paths of pipes. FJ is pumping milk…
https://www.lydsy.com/JudgeOnline/problem.php?id=4326 题意:N个点的树上给M条树链,问去掉一条边的权值之后所有树链长度和的最大值最小是多少. 首先想到去掉的树边一定是最长链上的树边,所以产生的思路就是寻找出一条询问里的最长链之后依次枚举上面所有的边,询问去掉这条边之后其余所有边的最大值. 由于N和M都在30W,直接暴力肯定不行,考虑转换思维,变为维护不经过这条边上的所有链的最大值,在这个最大值和最长链 - 这条边权之中取较大的值就是去掉这条边…
传送门 一道板子题. 直接树链剖分维护树上lca然后差分就行了. 代码: #include<bits/stdc++.h> #define N 50005 #define lc (p<<1) #define rc (p<<1|1) #define mid (T[p].l+T[p].r>>1) using namespace std; struct Node{int v,next,w;}e[N<<1]; int n,m,cnt=0,first[N],…