百度网站分析报告,网站建设应该注意什么,潮州 网站建设,做一个企业网站价格正题
题目链接:https://www.luogu.com.cn/problem/CF1039D 题目大意
给出nnn个点的一棵树#xff0c;然后对于k∈[1,n]k\in[1,n]k∈[1,n]求每次使用一条长度为kkk的链覆盖树并且不能重复覆盖点时最大覆盖条数。 1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路
先考虑暴力怎么…正题
题目链接:https://www.luogu.com.cn/problem/CF1039D 题目大意
给出nnn个点的一棵树然后对于k∈[1,n]k\in[1,n]k∈[1,n]求每次使用一条长度为kkk的链覆盖树并且不能重复覆盖点时最大覆盖条数。
1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路
先考虑暴力怎么做因为每条链的价值都是一显然的一种贪心思想是能合并的就合并没有让出一条链给另一条链腾空间的必要。
这样的复杂度是O(n)O(n)O(n)的但是对于每个都要求所以需要优化。
之后考虑上根号分治对于一个kkk的答案显然不会超过nk\frac{n}{k}kn所以可以当k≤nk\leq \sqrt nk≤n的时候暴力做然后由于答案递增大于n\sqrt nn的kkk答案的取值不会超过n\sqrt nn每次二分断点即可。时间复杂度O(nnlogn)O(n\sqrt n\log n)O(nnlogn)。
其实发现这样还是不够快可以找到一个更好的阈值设为TTT那么前面的复杂度就是TTT后面的复杂度就是nTlogn\frac{n}{T}\log nTnlogn用平衡规划的思想当TnTlognT\frac{n}{T}\log nTTnlogn时最快也就是TnlognT\sqrt{n\log n}Tnlogn时最快了。 code
#includecstdio
#includecstring
#includealgorithm
#includecmath
using namespace std;
const int N1e510;
struct node{int to,next;
}a[N1];
int n,tot,cnt,dfn[N],ls[N],fa[N],f[N];
void addl(int x,int y){a[tot].toy;a[tot].nextls[x];ls[x]tot;return;
}
void dfs(int x){dfn[cnt]x;for(int ils[x];i;ia[i].next){int ya[i].to;if(yfa[x])continue;fa[y]x;dfs(y);}return;
}
int solve(int k){if(k1)return n;int ans0;for(int i1;in;i)f[i]1;for(int in;i1;i--){int xdfn[i];if(f[x]f[fa[x]]){if(f[x]f[fa[x]]k)ans,f[fa[x]]0;else f[fa[x]]max(f[fa[x]],f[x]1);}}return ans;
}
int main()
{scanf(%d,n);for(int i1;in;i){int x,y;scanf(%d%d,x,y);addl(x,y);addl(y,x);}dfs(1);int Tsqrt((double)n*(log(n)/log(2))),last,zT1;for(int i1;iT;i)printf(%d\n,lastsolve(i));while(zn){int lz1,rn,ksolve(z);while(lr){int mid(lr)1;if(solve(mid)k)rmid-1;else lmid1;}for(int iz;ir;i)printf(%d\n,k);zr1;}return 0;
}