【USACO10HOL】 Cow Politics
题目大意
给出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相关推荐
- 【BZOJ3048】Cow lineup,贪心+队列维护(或二分答案)
传送门(权限题) 题面: 3048: [Usaco2013 Jan]Cow Lineup Time Limit: 2 Sec Memory Limit: 128 MB Submit: 121 Solv ...
- 【BZOJ-4422】Cow Confinement 线段树 + 扫描线 + 差分 (优化DP)
4422: [Cerc2015]Cow Confinement Time Limit: 50 Sec Memory Limit: 512 MB Submit: 61 Solved: 26 [Sub ...
- 【CF1307F】Cow and Vacation(并查集+lca倍增)
description 点击查看题目 solution 考虑将边拆分,边长×2\times 2×2 然后将kkk步以内可以互相走到的点用并查集合并在一起 同一个连通块的关键点可以相互走到 然后对于询问 ...
- 【poj3615】 Cow Hurdles
http://poj.org/problem?id=3615 (题目链接) 题意 给出一张有向图,求从u到v最大边最小的路径的最大边.→_→不会说话了.. Solution 好久没写Floyd了,水一 ...
- 【BZOJ4422】Cow Confinement【扫描线】【差分】【线段树】
题意 一个10610^6106行10610^6106列的网格图,上面有一些牛.花和一些矩形围栏,围栏在格子的边界上,牛和花在格子里,牛只能向下或向右走,不能穿过围栏和地图边界,求每头牛它能到达的花的数 ...
- jzoj 1594: 【USACO】The Chivalrous Cow(骑士牛)( 待加入)
1594: [USACO] 题目描述 Farmer John traded one of his cows for a cow that Farmer Don called 'The Knight' ...
- 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 [命题人:][下 ...
- 【HDOJ图论题集】【转】
1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...
- 【Java】6.7 内部类
目录 非静态内部类 静态内部类 使用内部类 局部内部类 匿名内部类 [内部类是什么?] 内部类 -- 就是把一个类放在类里面定义 内部类 - 寄生类 外部类 - 宿主类 内部类,由于踏上一级程序单元是 ...
最新文章
- linux的dns的转发域,Linux DNS服务器子域授权、转发器和转发域配置实例(三)
- PHP 利用 curl 发送 post get del put patch 请求
- 实验8.1 指针与数组 6-6 数组循环右移
- JavaScript里的...(三个点)操作符
- linux如何在C程序中使用exit,c语言exit和return区别,在fork和vfork中使用
- 树莓派教程 - 1.6 树莓派GPIO库wiringPi 外接USB串口ttyUSB ch340 cp2102
- MongoDB Java
- j2ee学习方法摘要
- 自己的旧手机做html服务器,旧手机改座机_怎么将手机改成为座机
- 搜索引擎的概念鄂州_搜索引擎的基本概念
- 安卓手机使用VNET抓包京东wskey
- HTML5作业:实现小米官网静态首页
- 关于DOM的知识点总结
- MPEG TS流简介
- 驰为 UBook XPro 平板 评测怎么样
- 关于Office 365 显示语言的设置(注册开通时的语言选择及注册开通后的语言显示修改)
- jQuery使用ajaxSubmit()提交表单以及AjaxSubmit的一些用法
- 单片机编程软件很简单(八),Keil单片机编程软件辅助功能讲解
- css中的background属性
- SQL难学吗,有什么好的学习建议?(转载)