[LUOGU] 4149 [IOI2011]Race】的更多相关文章

点分治裸题 #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…
题目:https://www.luogu.org/problemnew/show/P4149 第一道点分治! 点分治大约是每次找重心,以重心为根做一遍树形dp:然后对于该根的每个孩子,递归下去.递归之前把该根的vis设成1,就相当于删掉该点这边的这部分. 对于这道题,要开一个1e6的桶,就不能给每个节点都开了:所以弄一个全局的,在递归给孩子之前都赋成初值就行了. 注意要弄完一个孩子再把它的点的值加到该根的数组里,作为“之前孩子的值”:而且递归之前赋初值memset也比较慢,开一个栈之类的就都好了…
题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KKK ,且边的数量最小. 输入输出格式 输入格式: 第一行:两个整数 n,kn,kn,k . 第二至 nnn 行:每行三个整数,表示一条无向边的两端和权值 (注意点的编号从 000 开始). 输出格式: 一个整数,表示最小边数量. 如果不存在这样的路径,输出 −1-1−1 . 输入输出样例 输入样例#1: 复制 4 3 0 1 1 1 2 2 1 3 4 输出样例#1: 复制 2 说明 n≤200000,K≤1000000n\le 2…
Luogu 4149 Race 用点分治解决. 点分治在计算路径贡献时,为了不统计在一颗子树中的路径,解决方法一种是容斥,但在这种求最值问题中不便用容斥来撤销. 另一种则是,处理一颗子树时,只考虑前面的子树中产生的贡献,而将当前的子树的节点暂时存储在一个栈中,当前子树处理完毕后,再让栈中的点产生贡献,就可以解决求最值等容斥难以处理的问题. 就本题而言,记 \(tmp[i]\) 表示路径长度为 \(i\) 的路径中最少的边数.那么每条路径就可以更新答案 \(ans=\min\{ans,edges+…
数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新CNT数组和答案. 复杂度是O(NlogN) ------------------------------------------------------------------------------------------ #include<bits/stdc++.h>   using nam…
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…
[BZOJ2599][IOI2011]Race Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的两端和权值 (注意点的编号从0开始) Output 一个整数 表示最小边数量 如果不存在这样的路径 输出-1 Sample Input 4 3 0 1 1 1 2 2 1 3 4 Sample Output 2 题解:本题大…
[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…
[IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 4768  Solved: 1393[Submit][Status][Discuss] Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的两端和权值 (注意点的编号从0开始) Output 一个整数…
Brief Description 给定一棵带权树,你需要找到一个点对,他们之间的距离为k,且路径中间的边的个数最少. Algorithm Analyse 我们考虑点分治. 对于子树,我们递归处理,所以我们只考察经过重心的情况. 我们很容易把所有点的dist和deep预处理出来,所以,问题就转化成了求一个点对,使得 \(dist[i]+dist[j] = K\ and\ Belong[i] \neq Belong[j]\) 开始的时候,我想:这题我做过的!不就是在数列里面设两个指针吗? 然后,我…