[USACO10HOL]牛的政治Cow Politics
农夫约翰的奶牛住在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)个政党。而且每个政党至少有两只奶牛。 这些政党互相吵闹争。每个政党都想知道自己的“范围”有多大。其中,定义一个政党的范围是这个政党离得最远的两只奶牛(沿着双向道路行走)的距离。 输入输出格式 输入格式: * Line 1: Two space-separated integers: N and K * Lines 2..N+1: Line i+1 contains two space-separated integers: A_i and P_i 输出格式: * Lines 1..K: Line i contains a single integer that is the range of party i. 输入输出样例 输入样例#1: 6 2 1 3 2 1 1 0 2 1 2 1 1 5 输出样例#1: 3 2
题面
首先需要知道在只有一个政党的情况下,
题目弱化为求一个树中最远的两个点的距离,这个是可以用两遍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+20; 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][30],d[N]; vector<int>bg[N/2]; void dfs(int x) {for(int i=h[x];i;i=e[i].ne){int rr=e[i].v;d[rr]=d[x]+1;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=27;j>=0;--j)if((1<<j)&h) x=f[x][j];for(int j=27;j>=0;--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][0]; } int main() {scanf("%d%d",&n,&k);for(int i=1,x,y;i<=n;++i){scanf("%d%d",&x,&y);bg[x].push_back(i);if(y) add(y,i),f[i][0]=y;else rt=i;}d[rt]=1;dfs(rt);for(int j=1;j<=27;++j)for(int i=1;i<=n;++i)f[i][j]=f[f[i][j-1]][j-1];for(int i=1,x,y,z,dis;i<=k;++i){x=bg[i][0];y=0;for(int j=1;j<bg[i].size();++j){dis=d[bg[i][j]]+d[x]-2*d[lca(bg[i][j],x)];if(dis>y) y=dis,z=bg[i][j];}y=0;for(int j=0;j<bg[i].size();++j){dis=d[bg[i][j]]+d[z]-2*d[lca(bg[i][j],z)];if(dis>y) y=dis,x=bg[i][j];}printf("%d\n",y);}return 0; }
代码
转载于:https://www.cnblogs.com/adelalove/p/9135521.html
[USACO10HOL]牛的政治Cow Politics相关推荐
- P3033 [USACO11NOV]牛的障碍Cow Steeplechase
P3033 [USACO11NOV]牛的障碍Cow Steeplechase 题目描述 详见:P3033 [USACO11NOV]牛的障碍Cow Steeplechase solution 裸题. 对 ...
- 题解 洛谷 P3069 [USACO13JAN]牛的阵容Cow Lineup
洛谷P3069[USACO13JAN]牛的阵容CowLineup\color{#00F}{洛谷\ P3069\ [USACO13JAN]牛的阵容Cow Lineup}洛谷 P3069 [USACO13 ...
- 信息学奥赛一本通 1343:【例4-2】牛的旅行 | 洛谷 P1522 [USACO2.4] 牛的旅行 Cow Tours
[题目链接] ybt 1343:[例4-2]牛的旅行 洛谷 P1522 [USACO2.4] 牛的旅行 Cow Tours [题目考点] 1. 图论 最短路径 Floyd算法 Floyd算法时间复杂度 ...
- 脏牛(Dirty COW)漏洞攻击实验(SEED-Lab:Dirty-COW Attack Lab)
<脏牛(Dirty COW)漏洞攻击实验> 目录 <脏牛(Dirty COW)漏洞攻击实验> **一:实验目的** **二:实验步骤与结果** **漏洞原理:** **COW机 ...
- 【USACO10HOL】 Cow Politics
题目大意 给出k组点,求出组内两点间的最大距离 核心思路 考虑贪心,每组内的最深一点一定是两最远距离点对之一. 证明很简单,可以分为在该点的祖先相同和祖先不同的情况.如果点对其中一个为另一个的祖先的话 ...
- 洛谷 3029 [USACO11NOV]牛的阵容Cow Lineup
https://www.luogu.org/problem/show?pid=3029 题目描述 Farmer John has hired a professional photographer t ...
- 洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party
题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...
- 洛谷P1821 [USACO07FEB]银牛派对Silver Cow Party
题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...
- C++广度优先搜索算法之抓住那头牛(Catch that cow)
抓住那头牛: 农夫知道一头牛的位置,想要抓住它.农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000).农夫有两种移动方式: ...
- 【洛谷 1821】银牛派对Silver Cow Party
题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...
最新文章
- 万能头文件#include<bits/stdc++.h>更新GCC10.2.0版本
- 微软出面解释Win11各种大bug,引发网友一顿嘲讽:都是祖传手艺
- Spring Boot整合 Sentry 监控项目日志
- Exchange Server 2016管理系列课件33.通讯组仲裁
- 【工具】模板引擎 Velocity
- 前段react技术架构图_基于 React 的可视化编辑平台实践
- getprofile()获取不到路径_做一款RPG游戏,几乎都会用到的Python坐标最短路径计算...
- 题目 2055: 等待戈多(最短路)
- 搬货物(51Nod-1596)
- 每日算法系列【LeetCode 123】买卖股票的最佳时机 III
- mysql里判断_mysql里如何使用判断语句?
- RJ45网线水晶头线序,568A与568B区别,交叉线与直连线区别,10/100M base TX RJ45 接口引脚功能定义
- 前端基础之HTML5音视频标签(video/audio)讲解
- 中兴ZXDSL831驱动
- 抖音小店保证金被扣除怎么办?抖音小店货款什么时候结算?
- 节奏旋律音乐制作软件-Native Instruments Maschine 2 v2.14.1 WiN
- 用 Python 让 Excel 快速按条件筛选数据
- 什么是 IoT App SDK?
- c语言switch函数的作用,c语言的switchcase语句
- 一个作业题---用python创建一个通讯录