洛谷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…
题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 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…
正解:点分治 解题报告: 传送门$QwQ$ 昂先不考虑关于那个长度的限制考虑怎么做? 就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$ 然后现在考虑加入这个长度的限制?就考虑把这个桶,本来是个$bool$数组记录可行嘛,现在就改成$int$数组记录最小长度 然后就做完辣,,,?$QwQ$ #include<bits/stdc++.h> using namespace std; #define il inline #define int long long #define…
题目大意:给一棵树,每条边有边权.求一条简单路径,权值和等于$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…
题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之前把该根的vis设成1,就相当于删掉该点这边的这部分. 对于这道题,要开一个1e6的桶,就不能给每个节点都开了:所以弄一个全局的,在递归给孩子之前都赋成初值就行了. 注意要弄完一个孩子再把它的点的值加到该根的数组里,作为“之前孩子的值”:而且递归之前赋初值memset也比较慢,开一个栈之类的就都好了…
自TG滚粗后咕咕咕了这么久,最近重新开始学OI,也会慢慢开始更博了.... 最短路算法经典的就是SPFA(Bellman-Ford),Dijkstra,Floyd: 本期先讲两个经典的单源最短路算法: 首先是我最喜(hao)欢(xie)的SPFA(可惜经常被卡) SPFA: Warning:SPFA在OI竞赛中慎用,极易容易被卡!!! 基本流程: 从起点开始,每次将扫到的点入队,每个点遍历所有与其相连的点,并更新最短路,如果该点未入队,则将其入队: 均摊复杂度为$ O(KE) $(K=2),但因…
题目:https://www.luogu.org/problemnew/show/P4149 仍然是点分治: 不过因为是取 min ,所以不能用容斥,那么子树之间就必须分开算,记录桶时注意这个: 每次 memset 桶会很慢,可以用栈记录修改的地方,然后改回来即可: 注意更新 getrt 中 sum 的方式,可以 dfs 时顺便重新算一下 siz,但也可以利用原树求出来的 siz,判断一下当前的儿子在原树中是儿子还是父亲: 那么就要传个参数,是当前的所有点个数,在原树中是父亲的话就用总个数 -…
最近学习了一波LCT qwq 强势安利Flashhu的博客!!!!! 真的特别详细(可惜我不会弄链接) 如果有想要学习\(LCT\)的同学,可以直接看他的博客 我这里就简单写一点自己的体会啊. \(LCT\)大致上就是一个支持加边,删边,维护子树信息,路径修改,维护路径信息的一个数据结构 本质上LCT是一个实虚链划分 代码的话,主要是分为几个部分 首先是判断这个点是不是根 和 其儿子关系,也就是\(notroot\)和\(son\)函数 int son(int x) { if (ch[fa[x]…
题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过 n-1n−1 次合并之后, 就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所耗体力之和. 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为 11,并且已知果子的种类 数和每种果子的数目,你的任务是设计出合并的次序方案,…