[WC2010]重建计划(长链剖分版)】的更多相关文章

[WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大,马上想到套个二分,每次把边权变为原来的边权减去二分的答案,看树上有没有长度在\(L\)和\(U\)之间的正权链就好了. 于是乎问题就转变成了求树上权值和最大的链,这时马上想到我们以前做过的一道题P2993 [FJOI2014]最短路径树问题 题解,我已经在这道题的题解中把需要的思想讲明白了,如果你…
「WC2010」重建计划(长链剖分/点分治) 题目描述 有一棵大小为 \(n\) 的树,给定 \(L, R\) ,要求找到一条长度在 \([L, R]\) 的路径,并且路径上边权的平均值最大 \(1 \leq n,L,R \leq 10^5\) 解题思路 : 前几天沉迷初赛来写几道数据结构恢复一下代码能力,坑填完之后可能就要开始啃思维题了QwQ. 这个题貌似长链剖分和点分复杂度都是 \(O(nlog^2n)\) 的,点分好久都没碰了,长链剖分也只有暑假里口胡了几个多校的题而已,先讲做法吧 这个题…
传送门 Description Solution 时隔多年,补上了这题的长链剖分写法 感觉比点分治要好写的多 我们假设\(pos\)是当前点的\(dfn\),它距离所在链的底端的边的数量是\(len\),距离是\(siz\) 那么我们要求得\(g[pos...pos+len]\) 其中\(g[pos+i]+siz\)表示的是当前点往下长度为\(i\)的最长链的大小 初始情况下,\(g[pos]=-siz[pos]\) 为什么要这么写呢? 因为转移重儿子的时候,我们直接把数组右移了一位,这样子定义…
题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai,Bi,Vi分别表示道路(Ai,Bi),其价值为Vi 其中城市由1..N进行标号 输出 输出最大平均估值,保留三位小数 样例输入 4 2 3 1 2 1 1 3 2 1 4 3 样例输出 2.500 提示 N<=100000,1<=L<=U<=N-1,Vi<=1000000 这题算…
题目链接 BZOJ 洛谷 点分治 单调队列: 二分答案,然后判断是否存在一条长度在\([L,R]\)的路径满足权值和非负.可以点分治. 对于(距当前根节点)深度为\(d\)的一条路径,可以用其它子树深度在\([L-d,R-d]\)内的最大值更新.这可以用单调队列维护. 这需要子树中的点按dep排好序.可以用BFS,省掉sort. 直接这样的话,每次用之前的子树更新当前子树时,每次复杂度是\(O(\max\{dep\})\)的(之前子树中最大的深度).能被卡成\(O(n^2\log n)\). 可…
传送门 长链剖分好题. 题意简述:给一棵树,问边数在[L,R][L,R][L,R]之间的路径权值和与边数之比的最大值. 思路: 用脚指头想都知道要01分数规划. 考虑怎么checkcheckcheck. 发现就是求在转化成真·边权之后有没有长度在[L,R][L,R][L,R]之间的路径权值是大于0的. 然后可以设计状态fi,jf_{i,j}fi,j​表示iii开头长度为jjj的路径最大值,这个可以用长链剖分优化转移. 然后考虑怎么把经过iii的两条路径拼起来更新答案,这个可以用线段树优化转移,然…
题目大意: 求长度$\in [L,U]$的路径的最大边权和平均值. 题解 首先二分就不用说了,分数规划大家都懂. 这题有非常显然的点分治做法,但还是借着这个题学一波长链剖分. 其长链剖分本身也没啥,就是重链剖分中判断中儿子的参数由比较子树大小改为了子树最深点的深度. 这样一来,有一个很显然的性质,所有长链长度值和$<n$,然而这是废话,因为整棵树的边也只有$n-1$条. 长链剖分还有一个非常强大的能力,可以在线性的时间内合并以深度为下标的子树信息. 对于节点$x$和其长链连向的儿子$y$,由于在…
题意 自己看. 分析 求这个平均值的最大值就是分数规划,二分一下就变成了求一条长度在[L,R]内路径的权值和最大.有淀粉质的做法但是我没写,感觉常数会很大.这道题可以用长链剖分做. 先对树长链剖分. 我们像做dsu on tree一样先做重儿子,用线段树继承重儿子的全部信息,然后做其他轻儿子 查询的时候枚举一下路径的长度len,一边单点O(1)O(1)O(1)查询长度为len的最大权值,一边线段树O(logn)O(logn)O(logn)查询长度为[L-len,R-len]的区间即可 时间复杂度…
看到平均值一眼分数规划,二分答案mid,边权变为w[i]-mid,看是否有长度在[L,R]的正权路径.设f[i][j]表示以i为根向下j步最长路径,用长链剖分可以优化到O(1),查询答案线段树即可,复杂度O(nlog2n) 不知为什么bzoj上RE,luogu上AC,暂时不管了. #include<bits/stdc++.h> #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace st…
题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) 使得 \(\dfrac{\sum\limits_{e\in S}v(e)}{|S|}\ge mid\),将分母乘过去并稍微变个形可得 \(\sum\limits_{e\in S}v(e)-mid\ge 0\),也就是说我们将每条边边权都减去 \(mid\) 并检验包含 \([L,R]\) 条边的路…