题目大意

给出k组点,求出组内两点间的最大距离

核心思路

考虑贪心,每组内的最深一点一定是两最远距离点对之一。

证明很简单,可以分为在该点的祖先相同和祖先不同的情况。如果点对其中一个为另一个的祖先的话,一定会选择改组内最深的点,如果祖先不同,因为他们到lca的距离可以被等价地看为在该点的祖先上,所以也可以应用上述的结论。综上每组内的最深一点一定是两最远距离点对之一。

接下来的任务就是暴力地求解其余点到该最深点的距离。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define REP(i,e,s) for(register int i=e; i<=s; i++)
#define DREP(i,e,s) for(register int i=e; i>=s; i--)
int read() {int x=0,f=1,ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}return x*f;
}const int MAXN=200000+10;int n,m,a[MAXN],head[MAXN],_next[MAXN],to[MAXN],cnt,fa[MAXN][20],dept[MAXN],ans[MAXN],apd[MAXN],apdi[MAXN];void addedge(int u,int v) {cnt++;_next[cnt]=head[u];head[u]=cnt;to[cnt]=v;
}void dfs(int x) {if(apd[a[x]]<=dept[x]) {apd[a[x]]=dept[x];apdi[a[x]]=x;}for(int i=head[x]; i; i=_next[i]) {int y=to[i];//if(fa[x][0]==y) continue;fa[y][0]=x;dept[y]=dept[x]+1;dfs(y);}
}int lca(int u,int v) {if(dept[u]<dept[v]) swap(u,v);int h1=dept[u]-dept[v];DREP(i,17,0)if((1<<i)&h1) u=fa[u][i];if(u==v) return u;DREP(i,18,0)    if(fa[u][i]!=fa[v][i]) {u=fa[u][i];v=fa[v][i];}return fa[u][0];
}int main() {int n=read(),k=read();int _root;REP(i,1,n) {a[i]=read();int v=read();addedge(v,i);if(v==0) _root=i;}dept[_root]=1;dfs(_root);REP(j,1,17) REP(i,1,n)fa[i][j]=fa[fa[i][j-1]][j-1];   //printf("%d %d\n",fa[2][0],fa[5][0]);REP(i,1,n) { //printf("%d %d %d\n",i,apdi[a[i]],lca(i,apdi[a[i]]));ans[a[i]]=max(ans[a[i]],apd[a[i]]+dept[i]-2*dept[lca(apdi[a[i]],i)]);}REP(i,1,k) printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/MicDZ/p/USACO10HOL-CowPolitics.html

【USACO10HOL】 Cow Politics相关推荐

  1. 【BZOJ3048】Cow lineup,贪心+队列维护(或二分答案)

    传送门(权限题) 题面: 3048: [Usaco2013 Jan]Cow Lineup Time Limit: 2 Sec Memory Limit: 128 MB Submit: 121 Solv ...

  2. 【BZOJ-4422】Cow Confinement 线段树 + 扫描线 + 差分 (优化DP)

    4422: [Cerc2015]Cow Confinement Time Limit: 50 Sec  Memory Limit: 512 MB Submit: 61  Solved: 26 [Sub ...

  3. 【CF1307F】Cow and Vacation(并查集+lca倍增)

    description 点击查看题目 solution 考虑将边拆分,边长×2\times 2×2 然后将kkk步以内可以互相走到的点用并查集合并在一起 同一个连通块的关键点可以相互走到 然后对于询问 ...

  4. 【poj3615】 Cow Hurdles

    http://poj.org/problem?id=3615 (题目链接) 题意 给出一张有向图,求从u到v最大边最小的路径的最大边.→_→不会说话了.. Solution 好久没写Floyd了,水一 ...

  5. 【BZOJ4422】Cow Confinement【扫描线】【差分】【线段树】

    题意 一个10610^6106行10610^6106列的网格图,上面有一些牛.花和一些矩形围栏,围栏在格子的边界上,牛和花在格子里,牛只能向下或向右走,不能穿过围栏和地图边界,求每头牛它能到达的花的数 ...

  6. jzoj 1594: 【USACO】The Chivalrous Cow(骑士牛)( 待加入)

    1594: [USACO] 题目描述 Farmer John traded one of his cows for a cow that Farmer Don called 'The Knight' ...

  7. 2190: 【USACO】Farmer John has no Large Brown Cow

    2190: [USACO]Farmer John has no Large Brown Cow 时间限制: 1.000 Sec  内存限制: 64 MB 提交: 16  解决: 12 [命题人:][下 ...

  8. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  9. 【Java】6.7 内部类

    目录 非静态内部类 静态内部类 使用内部类 局部内部类 匿名内部类 [内部类是什么?] 内部类 -- 就是把一个类放在类里面定义 内部类 - 寄生类 外部类 - 宿主类 内部类,由于踏上一级程序单元是 ...

最新文章

  1. linux的dns的转发域,Linux DNS服务器子域授权、转发器和转发域配置实例(三)
  2. PHP 利用 curl 发送 post get del put patch 请求
  3. 实验8.1 指针与数组 6-6 数组循环右移
  4. JavaScript里的...(三个点)操作符
  5. linux如何在C程序中使用exit,c语言exit和return区别,在fork和vfork中使用
  6. 树莓派教程 - 1.6 树莓派GPIO库wiringPi 外接USB串口ttyUSB ch340 cp2102
  7. MongoDB Java
  8. j2ee学习方法摘要
  9. 自己的旧手机做html服务器,旧手机改座机_怎么将手机改成为座机
  10. 搜索引擎的概念鄂州_搜索引擎的基本概念
  11. 安卓手机使用VNET抓包京东wskey
  12. HTML5作业:实现小米官网静态首页
  13. 关于DOM的知识点总结
  14. MPEG TS流简介
  15. 驰为 UBook XPro 平板 评测怎么样
  16. 关于Office 365 显示语言的设置(注册开通时的语言选择及注册开通后的语言显示修改)
  17. jQuery使用ajaxSubmit()提交表单以及AjaxSubmit的一些用法
  18. 单片机编程软件很简单(八),Keil单片机编程软件辅助功能讲解
  19. css中的background属性
  20. SQL难学吗,有什么好的学习建议?(转载)

热门文章

  1. Android Framework 记录之一
  2. python基础 日常总结——列表(二)
  3. SAP ABAP FOR ALL ENTRIES 的用法
  4. 物联网端-云一体化应用管理解决方案
  5. 学生使用计算机的管理制度,学生使用计算机教室管理制度
  6. 懒懒的周末 (r8笔记第30天)
  7. 实用工具证件照制作微信小程序源码
  8. python中赋值语句和判断语句结合_Python 3 学习的第二小节——判断赋值语句与简单循环...
  9. 使用win7自带的备份还原、创建系统镜像
  10. 统信 Deepin为什么要摆脱Ubuntu和Debian?