P4149 [IOI2011]Race 点分治】的更多相关文章

思路: 点分治 提交:5次 题解: 刚开始用排序+双指针写的,但是调了一晚上,总是有两个点过不了,第二天发现原因是排序时的\(cmp\)函数写错了:如果对于路径长度相同的,我们从小往大按边数排序,当双指针出现\(==k\)时,即我们应先左移右指针,否则答案可能会变劣(仔细想一想):若反着排序,应该先右移左指针. #include<bits/stdc++.h> #define R register int using namespace std; namespace Luitaryi { tem…
正解:点分治 解题报告: 传送门$QwQ$ 昂先不考虑关于那个长度的限制考虑怎么做? 就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$ 然后现在考虑加入这个长度的限制?就考虑把这个桶,本来是个$bool$数组记录可行嘛,现在就改成$int$数组记录最小长度 然后就做完辣,,,?$QwQ$ #include<bits/stdc++.h> using namespace std; #define il inline #define int long long #define…
洛谷P4149 [IOI2011]Race 点分治作用(目前只知道这个): 求一棵树上满足条件的节点二元组(u,v)个数,比较典型的是求dis(u,v)(dis表示距离)满足条件的(u,v)个数. 算了自己懒得写了,安利几个blog吧: https://www.cnblogs.com/LadyLex/p/8006488.html https://blog.csdn.net/qq_39553725/article/details/77542223 https://blog.csdn.net/zzk…
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新CNT数组和答案. 复杂度是O(NlogN) ------------------------------------------------------------------------------------------ #include<bits/stdc++.h>   using nam…
[IOI2011]Race LG传送门 点分治板子题. 直接点分治统计,统计的时候开个桶维护下就好了. 注(tiao)意(le)细(hen)节(jiu). #include<cstdio> #include<cctype> #include<cstring> #define R register #define I inline using namespace std; const int S=200003,N=400003,K=1000003,inf=0x3f3f3f…
Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所以我们只考察经过重心的情况. 我们很容易把所有点的dist和deep预处理出来,所以,问题就转化成了求一个点对,使得 \(dist[i]+dist[j] = K\ and\ Belong[i] \neq Belong[j]\) 开始的时候,我想:这题我做过的!不就是在数列里面设两个指针吗? 然后,我…
题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之前把该根的vis设成1,就相当于删掉该点这边的这部分. 对于这道题,要开一个1e6的桶,就不能给每个节点都开了:所以弄一个全局的,在递归给孩子之前都赋成初值就行了. 注意要弄完一个孩子再把它的点的值加到该根的数组里,作为“之前孩子的值”:而且递归之前赋初值memset也比较慢,开一个栈之类的就都好了…
题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK ,且边的数量最小. 输入输出格式 输入格式:   第一行:两个整数 n,kn,k . 第二至 nn 行:每行三个整数,表示一条无向边的两端和权值 (注意点的编号从 00 开始).   输出格式:   一个整数,表示最小边数量. 如果不存在这样的路径,输出 -1−1 .   输入输出样例 输入样例#1:  4 3 0 1 1 1 2 2 1 3 4 输出样例#1:  2 说明 n\le 200000,K\le 1000000n≤20…
对于这道题,明显是点分治,权值等于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…
点分治.WA了一万年. 重点就是统计答案的方法 做法一(洛谷AC bzojWA 自测WA): 做点x时记到x距离为k的边数最小值为dis[k],然后对每一对有值的dis[i]和dis[K-i],给ans[A[i]+A[K-i]]++,然后因为统计到了一部分不合法答案,就做x的儿子,给ans变成--,最后查ans的第一个有值的点,就是答案. 错误原因:可能这个点有一个的不合法答案,但它的边数在等距离中不是最小的,他就不会被统计,等到一会减掉错误答案的时候却会被减掉,然后就错了 做法二 (洛谷TLE…