CF862 div2 D. A Wide, Wide Graph

╰+攻爆jí腚メ 2024-03-24 14:04 153阅读 0赞

Problems - Codeforces

d54b2f1d55aa48239a91dc1fcb026829.png

思路:

因为要我们输出k为1~n的答案,因此一定要去枚举k

然后对于枚举的每一个k,这个k值实际上指的是“半径”,对于树上一个结点,它与该半径之外的结点可以构成连通块,在半径里面的就不行,因此,对于那些离该结点最远距离的结点的距离都<k的结点来说,这些结点都是孤立的点,它们自己构成了一个连通块,其余的结点都构成一个连通块

因此我们需要去统计这些孤立的结点的个数

怎么去统计?我们可以预处理出所有结点到该结点所在连通块的其余结点的最远距离,如果该最远距离<k,则为孤立点

怎么去预处理?这个就是树的直径的典,两次dfs预处理出所有结点离直径两端点的最大距离就行

有一个结论就是,对于一个普通的结点,它离该连通块最远的距离就是它到直径两端点之一的距离取最大

Code:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. using i64 = long long;
  5. const int mxn=1e6+10;
  6. const int mxe=1e6+10;
  7. const int mod=1e9+7;
  8. struct ty{
  9. int to,next;
  10. }edge[mxe<<1];
  11. int n,m,u,v,tot=0;
  12. int head[mxn],dis[mxn],d[mxn];
  13. void add(int u,int v){
  14. edge[tot].to=v;
  15. edge[tot].next=head[u];
  16. head[u]=tot++;
  17. }
  18. void G_init(){
  19. tot=0;
  20. for(int i=0;i<=n;i++){
  21. head[i]=-1;
  22. dis[i]=0;
  23. d[i]=0;
  24. }
  25. }
  26. void dfs(int u,int fa){
  27. dis[u]=dis[fa]+1;
  28. for(int i=head[u];~i;i=edge[i].next){
  29. if(edge[i].to==fa) continue;
  30. dfs(edge[i].to,u);
  31. }
  32. }
  33. void solve(){
  34. cin>>n;
  35. G_init();
  36. for(int i=1;i<=n-1;i++){
  37. cin>>u>>v;
  38. add(u,v);
  39. add(v,u);
  40. }
  41. dfs(1,1);
  42. int mx=-1,pos=0;
  43. for(int i=1;i<=n;i++){
  44. if(mx<dis[i]){
  45. mx=dis[i];
  46. pos=i;
  47. }
  48. }
  49. dis[pos]=0;
  50. dfs(pos,pos);
  51. mx=-1;
  52. for(int i=1;i<=n;i++){
  53. d[i]=dis[i];
  54. if(mx<dis[i]){
  55. mx=dis[i];
  56. pos=i;
  57. }
  58. }
  59. dis[pos]=0;
  60. dfs(pos,pos);
  61. for(int i=1;i<=n;i++){
  62. d[i]=max(d[i],dis[i])-1;
  63. }
  64. int ans=0,now=1;
  65. sort(d+1,d+1+n);
  66. for(int i=1;i<=n;i++){
  67. while(now<=n&&d[now]<i) ans++,now++;
  68. cout<<min(ans+1,n)<<" \n"[i==n];
  69. }
  70. }
  71. signed main(){
  72. ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  73. int __=1;//cin>>__;
  74. while(__--)solve();return 0;
  75. }

发表评论

表情:
评论列表 (有 0 条评论,153人围观)

还没有评论,来说两句吧...

相关阅读

    相关 CF686div3 vp A~D

    哈哈,快一个月没v了,我是什么纯的 依旧是好死,不会\1300 这省赛还玩nm E后面单独补,因为我要睡觉了 ![7904d35e6caac8ca103f3666014

    相关 CF#581(Div.2)】A&B

    date:2019.8.20 我第一次打CF的比赛,感觉题目非常新颖并且非常棒,但是由于翻译软件不太给力所以我对题意的理解也不是很透彻,最后我做出了前两道题,感觉还可以吧

    相关 CF165D Beard Graph

    [题目链接][Link 1] 树剖题不用多说,一开始所有黑边的权值是-1,若有修改白边的操作,就把白边的值赋为100000。 之后查询边权之和时,如果和大于1000000,

    相关 推荐系统15:Wide & Deep 模型

    > 我们在前面已经提到过一个事实,就是推荐系统的框架大都是多种召回策略外挂一个融合排序。召回策略的姿势繁多,前面的专栏文章已经涉及了一部分内容。今天我们继续说融合排序。 要