[CF791D]Bear and Tree Jumps】的更多相关文章

题目描述 A tree is an undirected connected graph without cycles. The distance between two vertices is the number of edges in a simple path between them. Limak is a little polar bear. He lives in a tree that consists of n vertices, numbered 1 through n. L…
D. Bear and Tree Jumps   A tree is an undirected connected graph without cycles. The distance between two vertices is the number of edges in a simple path between them. Limak is a little polar bear. He lives in a tree that consists of n vertices, num…
我们要统计的答案是sigma([L/K]),L为路径的长度,中括号表示上取整. [L/K]化简一下就是(L+f(L,K))/K,f(L,K)表示长度为L的路径要想达到K的整数倍,还要加上多少. 于是,我们现在只需要统计sigma((L+f(L,K))),最后除以K即可. 统计sigma(L)时,我们考虑计算每条边出现在了几条路径中,设u为edgei的子节点,那么这条边对答案的贡献就是siz(u)*(n-siz(u)),siz(u)为u的子树大小. 统计sigma(f(L,K))时,我们需要dp出…
题意: 给出一棵树,一个人可以在树上跳,每次最多跳\(k(1 \leq k \leq 5)\)个点 定义\(f(s,t)\)为从顶点\(s\)跳到顶点\(t\)最少需要跳多少次 求\(\sum\limits_{s<t}f(s,t)\) 分析: 注意到\(k\)很小,为了方便转移,定义: \(sz(u,i)\)为\(u\)的子树中与\(u\)的距离模\(k\)等于\(i\)的孩子节点的个数 \(d(u,i)\)为从\(u\)跳到\(sz(u,i)\)对应的节点的跳数之和 转移: \(sz(u,(i…
[题目链接]:http://codeforces.com/contest/791/problem/D [题意] 你可以从树上的节点一次最多走k条边. (称为跳一次); 树为无权树; 然后问你任意两点之间的条的次数的和为多少; [题解] 如果k=1的话; 问题就是求任意两点之间的距离的和了; 这个可以在O(N)的复杂度下搞出来; 即 枚举每一条边; 看这条边左边的点的数目和右边的点的数目分别为多少->num1和num2 num1*num2就是经过这条边的路径个数; 累加所有的边的这个值就是任意两点…
题目链接 Bear and Tree Jumps 考虑树形DP.$c(i, j)$表示$i$最少加上多少后能被$j$整除. 在这里我们要算出所有$c(i, k)$的和. 其中$i$代表每个点对的距离,$k$为输入的$k$值. $f[i][j]$表示以$i$为根结点,深度对$k$取模为$j$的点的个数. 状态转移时$f[x][i]$一边更新一边和刚刚计算出的$f[u][j]$统计答案. 具体细节可以看代码. #include <bits/stdc++.h> using namespace std…
和FallDream组队瞎打一通--B两个人写的都挂了233,最后只剩下FallDream写的A和我写的C,最后我yy了个E靠谱做法结果打挂了,结束之后改了改就A了,难受. AC:AC Rank:180 Rating:2133-8->2125 A.Bear and Friendship Condition 题目大意:问一个无向图是否满足若a到b有边且b到c有边则a到c有边.(n<=150,000) 思路:判定每个连通块是不是团,不是则不满足,复杂度O(n). #include<cstdi…
Bear and Big Brother 签到题,直接模拟就可以了. Bear and Friendship Condition 满足只能是每个朋友圈中每个人和其他人都是朋友,这样的边数的确定的. 然后并查集求每个朋友圈大小再判断是否合法就可以啦. #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> #define LL long long #define maxn 3…
771C Bear and Tree Jumps 大意: 给定树,每步能走到距离不超过$k$的任意点,记$f(s,t)$为$s$到$t$的最少步数,求$\sum\limits_{s<t}f(s,t)$ 对于路径$(u,v)$, 假设距离为$d$, 那么贡献为$\lceil\frac{d}{k}\rceil=\frac{d+(-d\text{%}k+k)\text{%}k}{k}$ 也就是说枚举每条边的贡献算出总路径长, 再$O(nk^2)$的$dp$求出多余部分, 最后除以$k$即为答案 #in…
本次 5 道题均来自Codeforce 关于树形DP的算法讲解:Here 791D. Bear and Tree Jumps 如果小熊每次能跳跃的距离为1,那么问题变为求树上任意两点之间距离之和. 对于每一条边sum1和sum2分别表示边的左右点数,ans=各边的sum1*sum2之和即为答案. 而本题最大跳跃距离为k,答案变为(ans+sum)/k.sum为每一条边需要多走x步才能整除k的x之和. 树上任意两点间距离len=depth[x1]+depth[y1]-2*depth[f],f表示点…