[IOI2011]Race $O(nlog^{2}n)$ 做法】的更多相关文章

这个应该还不是正解,明天看一下正解到底是什么... Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #define maxn 500000 #define inf 0x7f7f7f using namespace std; char *q1,*q2,buf[1000000]; #define nc() (q1==q2&&(q2=(q1=buf…
2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBhttp://www.lydsy.com/JudgeOnline/problem.php?id=2599 Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的两端和权值 (注意点的编号从0开始) Outp…
2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答案,然后在遍历一边更新T,防止出现两个起点在同一棵子树中的情况. 代码 #include<cstdio> #include<algorithm> #include<cctype> using namespace std; ; const int INF = 1e9; str…
传送门 点分治,黄学长的选根方法会T掉,换了这个人的选根方法就可以了. 当然,你也可以选择黄学长的奇淫优化 //BZOJ 2599 //by Cydiater //2016.9.23 #include <iostream> #include <cstring> #include <string> #include <algorithm> #include <queue> #include <map> #include <ctim…
0.题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 1.分析:水题一道,一波树分治就好 我们可以发现这个题的K是比较小的,才100w,那么我们可以树分治一下,在遍历每一棵子树的时候我们知道要统计两个不同子树之间的权值,如果我们全遍历然后再getans,我们就会发现某个子树自己会和自己进行统计了一下,这样不太好,所有我们每遍历一个子树我们就把这个子树中从x所有长度为k的路径记录上v[k]=边数,记住要取min,然后询问我们还是遍历子树,我们查询v[K - k]然后统计答案.…
两题都是树分治. 1758这题可以二分答案avgvalue,因为avgvalue=Σv(e)/s,因此二分后只需要判断Σv(e)-s*avgvalue是否大于等于0,若大于等于0则调整二分下界,否则调整二分上界.假设一棵树树根为x,要求就是经过树根x的最大答案,不经过树根x的可以递归求解.假设B[i]为当前做到的一颗x的子树中的点到x的距离为i的最大权值,A[i]为之前已经做过的所有子数中的点到x的距离为i的最大权值(这里的权值是Σv(e)-i*avgvalue),那么对于当前子树的一个距离i,…
BZOJ权限题qwq Luogu sol 树上路径当然是淀粉质辣! 考虑所有过重心的路径.开一个\(10^6\)大小的数组\(t\)表示某一路径长度的最小边数,初始化为\(inf(i>0)\),\(t[0]=0\). 枚举重心的每棵子树进行\(dfs\),假设获得了一条从重心出发边数为\(dep\)边权和为\(dis\)的路径,就可以用\(t[K-dis]+dep\)更新答案. 更新完答案后对应用\(dep\)更新\(t[dis]\) 记得还原\(t\)数组.显然不能直接memset设为\(in…
题目 bzoj权限题... Luogu Sol 点分治辣,边权非负,k>=1,开个\(1e6\)的桶就好辣 # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(2e5 + 5); IL int Input(){ R…
对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include <bits/stdc++.h> using namespace std; #define up(i,l,r) for(register int i = (l); i <= (r); ++i) #define dn(i,l,r) for(register int i = (l); i >= (r…
http://www.lydsy.com/JudgeOnline/problem.php?id=2599 点分治 mi[i] 记录边权和为i时的最少边数 先更新答案,再更新mi数组,换根时清空mi #include<cstdio> #include<iostream> #include<algorithm> #include<cstdlib> using namespace std; #define N 200001 #define K 1000001 in…