首页 > TAG信息列表 > Wc2010
luogu P4292 [WC2010]重建计划
https://www.luogu.com.cn/problem/P4292 感觉长链剖分的难点在于指针的使用 具体实现看代码吧,关于每往上继承一个要加一条边的权值,可以利用差分的思想 code: #include<bits/stdc++.h> #define N 500050 #define db double #define ll long long using namespace std; struct edgluogu P4292 [WC2010]重建计划
题面传送门 这个一眼分数规划然后转化成树上长度在\([L,R]\)之间的最长路径问题。 这个东西可以长链剖分解决,就是像重链剖分一样用线段树维护,然后轻儿子暴力查找和加入即可。 注意不要忘了一条链的情况。 时间复杂度\(O(nlognlogw)\) code: #include<bits/stdc++.h> #define I inlP4293 [WC2010]能量场
P4293 [WC2010]能量场 题意 给你 \(n\) 个粒子,每个粒子有两个权值 \(m_i,c_i\) 每个相邻有序对 \((a,b)\) 会产生 \(m_am_b(c_a-c_b)\) 的贡献。现让你处理两个问题: 找出一个有序对使贡献最大。 找出一个序列成环后贡献和最大。 思路 我们将贡献转化一下: \[m_am_b(c_a-c_b)=m_ac[WC2010]重建计划
给定一颗带边权的树,求一条边数在 \([L, R]\) 之间的路径,并使得路径上边权的平均值最大。输出这个最大平均值。 \(n \leq 10^5\)。 同中位数 [Codeforces150E] Freezing with Style。 二分答案 \(ans\),每个边权减去 \(ans\),转换为判断是否存在路径的边权和非负。 这里是长链剖分[WC2010]重建计划 长链剖分 + 线段树
二分以后长链剖分 + 线段树, 扣了半天常数。 好像还用啥nb迭代优化一下二分。 #include<bits/stdc++.h>using namespace std;const int N = (int)1e5 + 7;const double eps = 1e-9;int n, L, U;int head[N], edge_tot;int len[N], son[N], w[N];int in[N], dfs_clock;double tmp[N[WC2010]重建计划(长链剖分+线段树+分数规划)
看到平均值一眼分数规划,二分答案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<【BZOJ2594】【WC2010】—水管局长数据加强版(LCT维护最小生成树)
传送门 水题,发现就是维护一个最小生成树 由于卡时间 ,就不直接用LCTLCTLCT连断边 先做一次KruscalKruscalKruscal 化边为点就可以了 不要用mapmapmap,似乎要被卡空间,每次二分判断 #include<bits/stdc++.h> using namespace std; const int RLEN=1<<22|1; inline char gc(){ sBZOJ1758 [Wc2010]重建计划
题意 N<=100000,1<=L<=U<=N-1,Vi<=1000000 分析 参照The_Virtuoso的题解。 这题算是长链剖分最经典的一道题了。 首先要找一个最优方案,直接DP显然不好做,那么考虑二分答案然后验证,因为是浮点数,要注意精度问题。 假设当前二分的答案是k,判断答案是否满足时原式也就转化成了\(\frac{\s