BZOJ 1776: [Usaco2010 Hol]cowpol 奶牛政坛 LCA + 树的直径
Code:
#include <bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 300000
using namespace std;
vector<int>G[maxn];
int n,tot,root,edges;
int fa[maxn];
int hd[maxn],to[maxn],nex[maxn],top[maxn],dep[maxn],son[maxn],siz[maxn];
void addedge(int u,int v) {
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs1(int u) {
dep[u]=dep[fa[u]]+1, siz[u]=1;
for(int i=hd[u];i;i=nex[i]) {
int v=to[i];
if(v==fa[u]) continue;
dfs1(v), siz[u]+=siz[v];
if(siz[v]>siz[son[u]]) son[u]=v;
}
}
void dfs2(int u,int tp) {
top[u]=tp;
if(son[u]) dfs2(son[u], tp);
for(int i=hd[u];i;i=nex[i]) {
int v=to[i];
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
}
int LCA(int x,int y) {
while(top[x]^top[y]) {
dep[top[x]] > dep[top[y]] ? x = fa[top[x]] : y = fa[top[y]];
}
return dep[x]<dep[y]?x:y;
}
int main() {
// setIO("input");
scanf("%d%d",&n,&tot);
for(int i=1;i<=n;++i) {
int ty;
scanf("%d%d",&ty,&fa[i]);
if(!fa[i]) root=i;
else addedge(fa[i],i);
G[ty].push_back(i);
}
dfs1(root), dfs2(root,root);
for(int i=1;i<=tot;++i) {
int mx=0,ans=0;
for(int j=0;j<G[i].size();++j) {
if(dep[G[i][j]] > dep[mx]) mx = G[i][j];
}
for(int j=0;j<G[i].size();++j) {
// printf("%d %d\n",mx,G[i][j]);
ans=max(ans, dep[mx] + dep[G[i][j]] - (dep[LCA(mx, G[i][j])] << 1));
}
printf("%d\n",ans);
}
return 0;
}
BZOJ 1776: [Usaco2010 Hol]cowpol 奶牛政坛 LCA + 树的直径的更多相关文章
- bzoj 1776: [Usaco2010 Hol]cowpol 奶牛政坛——树的直径
农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可以抵达其他所 ...
- bzoj:1776: [Usaco2010 Hol]cowpol 奶牛政坛
Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...
- 【BZOJ】1776: [Usaco2010 Hol]cowpol 奶牛政坛
[题意]给定n个点的树,每个点属于一个分类,求每个分类中(至少有2个点)最远的两点距离.n<=200000 [算法]LCA [题解]结论:树上任意点集中最远的两点一定包含点集中深度最大的点(求树 ...
- bzoj [Usaco2010 Hol]cowpol 奶牛政坛【树链剖分】
意识流虚树 首先考虑只有一个党派,那么可以O(n)求树的直径,步骤是随便指定一个根然后找距离根最远点,然后再找距离这个最远点最远的点,那么最远点和距离这个最远点最远的点之间的距离就是直径 那么考虑多党 ...
- COGS——T 803. [USACO Hol10] 政党 || 1776: [Usaco2010 Hol]cowpol 奶牛政坛
http://www.lydsy.com/JudgeOnline/problem.php?id=1776||http://cogs.pro/cogs/problem/problem.php?pid=8 ...
- [bzoj1776][Usaco2010 Hol]cowpol 奶牛政坛_倍增lca
[Usaco2010 Hol]cowpol 奶牛政坛 题目大意: 数据范围:如题面. 题解: 第一想法是一个复杂度踩标程的算法..... 就是每种政党建一棵虚树,然后对于每棵虚树都暴力求直径就好了,复 ...
- 【BZOJ1776】[Usaco2010 Hol]cowpol 奶牛政坛 树的直径
[BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛 Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N. ...
- [BZOJ1776][Usaco2010 Hol]cowpol 奶牛政坛
Description 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片 ...
- [Usaco2010 Hol]cowpol 奶牛政坛
题目描述: 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地.而且从每片草地出发都可 ...
随机推荐
- TFS 删除工作区签出状态
'//找出当前工作组未迁出的文件 delete tbl_pendingchange '
- eclipse sts 快捷键
1. ctrl + m 全屏/取消全屏 2.快速切换上面标签 ctrl + pageup/pagedown : 标签左右切换 ctrl + < > : 标签前后访问处切换 New Ja ...
- mysql定时任务/mysql作业
转自:https://www.jb51.net/article/138569.htm 详细参考:https://www.cnblogs.com/qlqwjy/p/7954175.html(事件& ...
- spring循环依赖是怎么解决的?
回答:循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleA,则它们最终反映为一个环. Spring如何解决循环依赖? ...
- java学习day1
一.常用的DOS命令 1.打开cmd 窗口键+r --> 输入cmd --> 确认 2.常用的dos命令 dir:列出当前目录下的所有文件及文件夹 md:创建一个新的目录 rd:删除目录 ...
- C++基础-多态
本文为 C++ 学习笔记,参考<Sams Teach Yourself C++ in One Hour a Day>第 8 版.<C++ Primer>第 5 版.<代码 ...
- mysql分组统计后将结果顺序排列(union实现)
工作中用到统计12月份通话记录,统计号码拨打次数,但是问题出在一个号码可以拨打多次,每次可能接通也可能不接通,如果用主叫号码caller字段group by分组后count(*)统计数目,这样会导致不 ...
- 8. golang 基本类型转换
golang 类型转换只能显性转换 不能自动转换 基本数据类型间的转换 var x1 int = 2 var x2 int16 var x3 int8 x2 = 200 + x1 x3 = 200 + ...
- pathlib模块替代os.path
pathlib模块替代os.path 在Python 3.4之前和路径相关操作函数都放在os模块里面,尤其是os.path这个子模块,可以说os.path模块非常常用.而在Python 3.4,标准库 ...
- 环境变量和Path环境变量
环境变量 百度百科下的定义 一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等. 环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所 ...