农夫约翰的奶牛住在N ( <= N <= ,)片不同的草地上,标号为1到N。恰好有N-1条单位长度的双向道路,用各种各样的方法连接这些草地。而且从每片草地出发都可以抵达其他所有草地。也就是说,这些草地和道路构成了一种叫做树的图。输入包含一个详细的草地的集合,详细说明了每个草地的父节点P_i ( <= P_i <= N)。根节点的P_i == , 表示它没有父节点。因为奶牛建立了1到K一共K ( <= K <= N/)个政党。每只奶牛都要加入某一个政党,其中, 第i只奶牛属于第A_i ( <= A_i <= K)个政党。而且每个政党至少有两只奶牛。 这些政党互相吵闹争。每个政党都想知道自己的“范围”有多大。其中,定义一个政党的范围是这个政党离得最远的两只奶牛(沿着双向道路行走)的距离。
输入输出格式
输入格式:
* Line : Two space-separated integers: N and K
* Lines ..N+: Line i+ contains two space-separated integers: A_i and P_i
输出格式:
* Lines ..K: Line i contains a single integer that is the range of party i.
输入输出样例
输入样例#: 输出样例#:

题面

首先需要知道在只有一个政党的情况下,

题目弱化为求一个树中最远的两个点的距离,这个是可以用两遍BFS的方法求出,

具体步骤为:
随便选择一个节点x,BFS求出距离x最远的节点y(有相同的随便选)。
以节点y为起点,BFS求出距离y最远的节点z(有相同的随便选)。
节点y和节点z之间的距离,就是这棵树中最远距离。
有了上面这个之后,在本题中,我们对每个政党都做一遍这个方法即可,

但是我们不能进行BFS了。注意到BFS只是为了求距离最远的点,

那么如果我们可以通过其他方法来求得任意两点间距离的话,步骤就可以转变为:
随便选择该政党的一个节点x,枚举该政党的其他节点,求出距离x最远的节点y。
以节点y为起点,枚举该政党的其他节点,求出距离y最远的节点z。
节点y和节点z的距离,就是该政党的最远距离。
对于求树上任意两点间的距离,一般转化为求LCA的,即
Dist(x, y) = Depth(x) + Depth(y) - 2 * Depth(LCA(x, y))
求LCA的方法有很多,这里就不再描述了。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+;
int h[N],n,tot,k;
struct node{
int v,ne;
}e[N];
void add(int u,int v)
{
tot++;e[tot]=(node){v,h[u]};h[u]=tot;
}
int rt,f[N][],d[N];
vector<int>bg[N/];
void dfs(int x)
{
for(int i=h[x];i;i=e[i].ne)
{
int rr=e[i].v;
d[rr]=d[x]+;
dfs(rr);
}
}
int lca(int x,int y)
{
if(d[x]<d[y]) swap(x,y);
int h=d[x]-d[y];
for(int j=;j>=;--j)
if((<<j)&h) x=f[x][j];
for(int j=;j>=;--j)
if(f[x][j]!=f[y][j]) x=f[x][j],y=f[y][j];
if(x==y) return x;
else return f[x][];
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=,x,y;i<=n;++i)
{
scanf("%d%d",&x,&y);
bg[x].push_back(i);
if(y) add(y,i),f[i][]=y;
else rt=i;
}
d[rt]=;dfs(rt);
for(int j=;j<=;++j)
for(int i=;i<=n;++i)
f[i][j]=f[f[i][j-]][j-];
for(int i=,x,y,z,dis;i<=k;++i)
{
x=bg[i][];y=;
for(int j=;j<bg[i].size();++j)
{
dis=d[bg[i][j]]+d[x]-*d[lca(bg[i][j],x)];
if(dis>y) y=dis,z=bg[i][j];
}
y=;
for(int j=;j<bg[i].size();++j)
{
dis=d[bg[i][j]]+d[z]-*d[lca(bg[i][j],z)];
if(dis>y) y=dis,x=bg[i][j];
}
printf("%d\n",y);
}
return ;
}

代码

[USACO10HOL]牛的政治Cow Politics的更多相关文章

  1. LCA【洛谷P2971】 [USACO10HOL]牛的政治Cow Politics

    P2971 [USACO10HOL]牛的政治Cow Politics 农夫约翰的奶牛住在N (2 <= N <= 200,000)片不同的草地上,标号为1到N.恰好有N-1条单位长度的双向 ...

  2. 洛谷2971 [USACO10HOL]牛的政治Cow Politics

    原题链接 假设只有一个政党,那么这题就退化成求树的直径的问题了,所以我们可以从此联想至\(k\)个政党的情况. 先处理出每个政党的最大深度,然后枚举每个政党的其它点,通过\(LCA\)计算长度取\(\ ...

  3. 洛谷P2971 牛的政治Cow Politics

    题目描述 Farmer John's cows are living on \(N (2 \leq N \leq 200,000)\)different pastures conveniently n ...

  4. bzoj1648 / P2853 [USACO06DEC]牛的野餐Cow Picnic

    P2853 [USACO06DEC]牛的野餐Cow Picnic 你愿意的话,可以写dj. 然鹅,对一个缺时间的退役选手来说,暴力模拟是一个不错的选择. 让每个奶牛都把图走一遍,显然那些被每个奶牛都走 ...

  5. bzoj1623 / P2909 [USACO08OPEN]牛的车Cow Cars

    P2909 [USACO08OPEN]牛的车Cow Cars 显然的贪心. 按速度从小到大排序.然后找车最少的车道,查询是否能填充进去. #include<iostream> #inclu ...

  6. bzoj1604 / P2906 [USACO08OPEN]牛的街区Cow Neighborhoods

    P2906 [USACO08OPEN]牛的街区Cow Neighborhoods 考虑维护曼哈顿距离:$\left | x_{1}-x_{2} \right |+\left | y_{1}-y_{2} ...

  7. 洛谷——P1821 [USACO07FEB]银牛派对Silver Cow Party

    P1821 [USACO07FEB]银牛派对Silver Cow Party 题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently ...

  8. P2966 [USACO09DEC]牛收费路径Cow Toll Paths

    P2966 [USACO09DEC]牛收费路径Cow Toll Paths 题目描述 Like everyone else, FJ is always thinking up ways to incr ...

  9. 洛谷P1522 牛的旅行 Cow Tours

    ---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...

随机推荐

  1. finereport连接mysql8.0的解决办法

    1.具体连接操作 首先将mysql-connector-java-8.0以上的jar包放到FindReport安装目录下的webapps下的WEB-INF下的lib下. 打开finereport,找到 ...

  2. java中public、private、protected区别

    类中的数据成员和成员函数据具有的访问权限包括:public.private.protect.friendly(包访问权限) 1.public:public表明该数据成员.成员函数是对所有用户开放的,所 ...

  3. Github 上 Star 最多的个人 Spring Boot 开源学习项目(三)

    网上连载了 Spring Boot 系列文章 这个开源项目就是 spring-boot-examples ,这是一个专注帮助初学者学习 Spring Boot 的开源项目,里面分享了各种场景下 Spr ...

  4. MySql-Mysql技术内幕~SQL编程学习笔记(1)

    1.MySQL的历史,一些相关概念. 2.MySQL数据类型 *通常一个页内可以存放尽可能多的行,那么数据库的性能就越好,选择一个正确的数据类型至关重要. 1>UNSIGNED类型: 将数字类型 ...

  5. JDBC插入中文数据出现?号地解决问题

    1. 查看jdbc配置是否指定编码 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/te ...

  6. Linux 環境下安裝swoole

    一.先安装依赖 yum -y install gcc gcc-c++ autoconf automake yum -y install zlib zlib-devel openssl openssl- ...

  7. Zookeeper — 应用场景

    大致来说,zookeeper 的使用场景如下,我就举几个简单的,大家能说几个就好了: 分布式协调 分布式锁 元数据/配置信息管理 HA高可用性 分布式协调 这个其实是 zookeeper 很经典的一个 ...

  8. Python2 中 range 和 xrange 的区别?

    两者用法相同,不同的是 range 返回的结果是一个列表,而 xrange 的结果是一个生成器,前者是直接开辟一块内存空间来保存列表,后者是边循环边使用,只有使用时才会开辟内存空间,所以当列表很长时, ...

  9. 逆向与反汇编实战(一)--PEiD分析复现

    1.准备 简介: PEiD(PE Identifier)是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470 种PE 文档 的加壳类型和签名. 整个过程需要测试文件成品:htt ...

  10. 简单的物流项目实战,WPF的MVVM设计模式(一)

    新建一个WPF项目,命名为WMS 然后分别新建文件夹,Data,Models,Views,ViewModels,Services,如下图所示 然后通过NuGet安装连个Nuget包,分别为SQLite ...