#点分治#洛谷 4149 [IOI2011]Race】的更多相关文章

题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之前把该根的vis设成1,就相当于删掉该点这边的这部分. 对于这道题,要开一个1e6的桶,就不能给每个节点都开了:所以弄一个全局的,在递归给孩子之前都赋成初值就行了. 注意要弄完一个孩子再把它的点的值加到该根的数组里,作为“之前孩子的值”:而且递归之前赋初值memset也比较慢,开一个栈之类的就都好了…
洛谷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…
正解:点分治 解题报告: 传送门$QwQ$ 昂先不考虑关于那个长度的限制考虑怎么做? 就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$ 然后现在考虑加入这个长度的限制?就考虑把这个桶,本来是个$bool$数组记录可行嘛,现在就改成$int$数组记录最小长度 然后就做完辣,,,?$QwQ$ #include<bits/stdc++.h> using namespace std; #define il inline #define int long long #define…
题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 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$,且边的数量最小. 题解:点分治,考虑到这是最小值,不满足可减性,于是点分中的更新答案的地方计算重复的部分要做更改,就用一个数组记录前面的答案.更新答案的时候只从已经访问过的部分来转移. 卡点:一个地方没有$return$,导致$RE$ C++ Code: #include <cstdio> #define maxn 200010 #define maxk 1000010 const int inf = 0x3f3f3f3f;…
P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行,每行包含三个整数,表示一条无向边的两端和权值. 注意点的编号从 00 开始. 输出格式 输出一个整数,表示最小边数量. 如果不存在这样的路径,输出 -1−1. 输入输出样例 输入 #1复制 4 3 0 1 1 1 2 2 1 3 4 输出 #1复制 2 说明/提示 保证 n \leqslant 2…
如果想看原题网址的话请点击这里:地毯填补问题 原题: 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了.公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有四种选择(如图): (此处图误见后处的图) 并且每一方格只能用一层地毯,迷宫的大小为 ^k * ^k的方形.当然,也不能让公主无限制的在那儿等,对吧?由于你使…
点此看题面 大致题意: 给你一棵树,问长度为\(K\)的路径至少由几条边构成. 点分治 这题应该比较显然是点分治. 主要思路 与常见的点分治套路一样,由于\(K≤1000000\),因此我们可以考虑开个桶\(f\)数组来记录每种长度的路径至少由几条边构成. 但是要注意,每换一个根要将桶清空! 呃,暴力清空肯定\(T\)飞. 于是就需要再开一个\(g\)数组,记录每个答案是在以哪一个节点为根时求出来的,这样就可以避免清空数组了.这也是一个比较常用的套路. 其余的过程与点分板子差不多,就不多说了.…
点分治裸题 #include<iostream> #include<cstring> #include<cstdio> using namespace std; inline int rd(){ ,f=;char c; :; +c-',c=getchar(); return ret*f; } ; struct Edge{ int next,to,w; }e[MAXN<<]; int ecnt,head[MAXN]; inline void add(int x…
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新CNT数组和答案. 复杂度是O(NlogN) ------------------------------------------------------------------------------------------ #include<bits/stdc++.h>   using nam…