http://www.lydsy.com/JudgeOnline/problem.php?id=1776||http://cogs.pro/cogs/problem/problem.php?pid=803

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 507  Solved: 246
[Submit][Status][Discuss]

Description

农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N。恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地。而且从每片草地出发都可以抵达其他所有草地。也就是说,这些草地和道路构成了一种叫做树的图。输入包含一个详细的草地的集合,详细说明了每个草地的父节点P_i (0 <= P_i <= N)。根节点的P_i == 0, 表示它没有父节点。因为奶牛建立了1到K一共K (1 <= K <= N/2)个政党。每只奶牛都要加入某一个政党,其中, 第i只奶牛属于第A_i (1 <= A_i <= K)个政党。而且每个政党至少有两只奶牛。 这些政党互相吵闹争。每个政党都想知道自己的“范围”有多大。其中,定义一个政党的范围是这个政党离得最远的两只奶牛(沿着双向道路行走)的距离。 比如说,记为政党1包含奶牛1,3和6,政党2包含奶牛2,4和5。这些草地的连接方式如下图所 示(政党1由-n-表示):  政党1最大的两只奶牛的距离是3(也就是奶牛3和奶牛6的距离)。政党2最大的两只奶牛的距离是2(也就是奶牛2和4,4和5,还有5和2之间的距离)。 帮助奶牛们求出每个政党的范围。

Input

* 第一行: 两个由空格隔开的整数: N 和 K * 第2到第N+1行: 第i+1行包含两个由空格隔开的整数: A_i和P_i

Output

* 第1到第K行: 第i行包含一个单独的整数,表示第i个政党的范围。

Sample Input

6 2
1 3
2 1
1 0
2 1
2 1
1 5

Sample Output

3
2

HINT

 

Source

Gold

距离最远的两个点之中,一定有一个是在当前政党中深度最深的,枚举另一个点,更新政党范围

mdzz我居然用点编号和深度去比较!!

  1. #include <cstdio>
  2.  
  3. const int N(2e5+);
  4. int a[N],p[N],deps[N],ans[N];
  5. int head[N],sumedge;
  6. struct Edge
  7. {
  8. int v,next;
  9. Edge(int v=,int next=):v(v),next(next){}
  10. }edge[N<<];
  11. inline void ins(int u,int v)
  12. {
  13. edge[++sumedge]=Edge(v,head[u]);
  14. head[u]=sumedge;
  15. edge[++sumedge]=Edge(u,head[v]);
  16. head[v]=sumedge;
  17. }
  18.  
  19. #define max(a,b) (a>b?a:b)
  20. #define swap(a,b) {int tmp=a;a=b,b=tmp;}
  21. int dad[N],dep[N],size[N],son[N],top[N];
  22. void DFS(int u)
  23. {
  24. size[u]=;
  25. dep[u]=dep[dad[u]]+;
  26. for(int v,i=head[u];i;i=edge[i].next)
  27. {
  28. v=edge[i].v;
  29. if(dad[u]==v) continue;
  30. dad[v]=u; DFS(v); size[u]+=size[v];
  31. if(size[son[u]]<size[v]) son[u]=v;
  32. }
  33. }
  34. void DFS_(int u,int Top)
  35. {
  36. top[u]=Top;
  37. if(son[u]) DFS_(son[u],Top);
  38. for(int v,i=head[u];i;i=edge[i].next)
  39. {
  40. v=edge[i].v;
  41. if(dad[u]!=v&&son[u]!=v) DFS_(v,v);
  42. }
  43. }
  44. int LCA(int x,int y)
  45. {
  46. for(;top[x]!=top[y];y=dad[top[y]])
  47. if(dep[top[x]]>dep[top[y]]) swap(x,y);
  48. return dep[x]<dep[y]?x:y;
  49. }
  50.  
  51. inline void read(int &x)
  52. {
  53. x=; register char ch=getchar();
  54. for(;ch>''||ch<'';) ch=getchar();
  55. for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-'';
  56. }
  57. inline void write(int x)
  58. {
  59. if(x/) write(x/);
  60. putchar(x%+'');
  61. }
  62. int AC()
  63. {
  64. // freopen("cowpol.in","r",stdin);
  65. // freopen("cowpol.out","w",stdout);
  66.  
  67. int n,k,rt; read(n),read(k);
  68. for(int i=;i<=n;i++)
  69. {
  70. read(a[i]),read(p[i]);
  71. if(!p[i]) rt=i;
  72. else ins(p[i],i);
  73. }
  74. DFS(rt); DFS_(rt,rt);
  75. for(int i=;i<=n;i++)
  76. if(dep[i]>dep[deps[a[i]]]) deps[a[i]]=i;
  77. for(int lca,i=;i<=n;i++)
  78. {
  79. lca=LCA(i,deps[a[i]]);
  80. ans[a[i]]=max(ans[a[i]],dep[i]+dep[deps[a[i]]]-dep[lca]*);
  81. }
  82. for(int i=;i<=k;i++)
  83. write(ans[i]),puts("");
  84. return ;
  85. }
  86.  
  87. int I_want_AC=AC();
  88. int main(){;}

COGS——T 803. [USACO Hol10] 政党 || 1776: [Usaco2010 Hol]cowpol 奶牛政坛的更多相关文章

  1. bzoj:1776: [Usaco2010 Hol]cowpol 奶牛政坛

    Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...

  2. bzoj 1776: [Usaco2010 Hol]cowpol 奶牛政坛——树的直径

    农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可以抵达其他所 ...

  3. 【BZOJ】1776: [Usaco2010 Hol]cowpol 奶牛政坛

    [题意]给定n个点的树,每个点属于一个分类,求每个分类中(至少有2个点)最远的两点距离.n<=200000 [算法]LCA [题解]结论:树上任意点集中最远的两点一定包含点集中深度最大的点(求树 ...

  4. BZOJ 1776: [Usaco2010 Hol]cowpol 奶牛政坛 LCA + 树的直径

    Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...

  5. 【BZOJ1776】[Usaco2010 Hol]cowpol 奶牛政坛 树的直径

    [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛 Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N. ...

  6. [bzoj1776][Usaco2010 Hol]cowpol 奶牛政坛_倍增lca

    [Usaco2010 Hol]cowpol 奶牛政坛 题目大意: 数据范围:如题面. 题解: 第一想法是一个复杂度踩标程的算法..... 就是每种政党建一棵虚树,然后对于每棵虚树都暴力求直径就好了,复 ...

  7. [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛

    Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...

  8. [Usaco2010 Hol]cowpol 奶牛政坛

    题目描述: 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可 ...

  9. bzoj [Usaco2010 Hol]cowpol 奶牛政坛【树链剖分】

    意识流虚树 首先考虑只有一个党派,那么可以O(n)求树的直径,步骤是随便指定一个根然后找距离根最远点,然后再找距离这个最远点最远的点,那么最远点和距离这个最远点最远的点之间的距离就是直径 那么考虑多党 ...

随机推荐

  1. 【【henuacm2016级暑期训练】动态规划专题 I】Gargari and Permutations

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 注意这k个序列每个都是排列. 如果在每个序列中都满足y出现在x之后的话. 那么我们从x连一条有向边至y (有一个序列不满足就不连 ( ...

  2. DQL查询语句使用(select)

      9)DQL查询语句使用   SELECT语句在PL/SQL中使用,必须 采用下面用法:     select id INTO 变量   from t001 where id=5;    将记录字段 ...

  3. 高级函数-case

    case函数 (适合区间,>,<判断)    case when 判断表达式 then         when 判断表达式 then         .....    end     s ...

  4. (转)redis源代码分析 – event library

    每个cs程序尤其是高并发的网络服务端程序都有自己的网络异步事件处理库,redis不例外. 事件库仅仅包括ae.c.ae.h,还有3个不同的多路复用(本文仅描述epoll)的wrapper文件,事件库封 ...

  5. ubuntu下使用Nexus搭建Maven私服

    ubuntu下使用Nexus搭建Maven私服 1.私服简介: 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服, ...

  6. FPGA实现网络通信时的网络字节序问题

    在上位机软件发送字符abcd 在鲨鱼上抓包 用逻辑分析仪从FPGA网络接收管脚分析 数据接收后存储在位宽为8bit的ram中 从ram中读32bitUDP数据为 64636261 依据以上那个现象, ...

  7. 关于Servo项目中Rust代码行数的数据来源

    我两个月之前的一篇博客<为什么我说Rust是靠谱的编程语言>(下面简称原文),在当中"6. 两个半大型成功案例"一节.我以前写道: Servo: 下一代浏览器渲染引擎( ...

  8. [Python]threading local 线程局部变量小測试

    概念 有个概念叫做线程局部变量.一般我们对多线程中的全局变量都会加锁处理,这样的变量是共享变量,每一个线程都能够读写变量,为了保持同步我们会做枷锁处理.可是有些变量初始化以后.我们仅仅想让他们在每一个 ...

  9. c#将List&lt;T&gt;转换成DataSet

    /// <summary>         /// List<T> 转换成DataSet         /// </summary>         /// &l ...

  10. 【c++版数据结构】之顺序表的实现

    SeqList.h #ifndef SEQLIST_H #define SEQLIST_H #include<iostream> using namespace std; typedef ...