Description

Solution

一道很裸的题目,51Nod上有一个加强版的叫树中最远点对。

思路

有对子树限制的就想一想dfs序。然后在dfs序上建一个线段树每个点存储它表示的点集的最长距离和对应的两个点,合并的时候有六种情况,两个子树的两个点两两配对,然后再与这两个点的值比较,一共六种。
最后查询的时候,限制的两棵子树在dfs序上,分成了三个区间,这三个区间分别询问就好了。

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define rep(i,a) for(i=first[a];i;i=next[i])
using namespace std;
const int maxn=100007;
int first[maxn*2],next[maxn*2],last[maxn*2],num;
int i,j,k,l,n,m,q,da,da1,mx,mx1,dfn,wei[maxn],p[maxn],hou[maxn];
int d[maxn],deep[maxn],f[maxn][20];
bool bz[maxn];
struct node{int sum,yi,er;
}t[maxn*3],ans;
void add(int x,int y){last[++num]=y;next[num]=first[x];first[x]=num;
}
void dfs(int x,int y){int i;wei[x]=++dfn;p[dfn]=x;f[x][0]=y;deep[x]=deep[y]+1;rep(i,x){if(last[i]!=y){dfs(last[i],x);}}hou[x]=dfn;
}
int lca(int x,int y){int i,z=0;if(deep[x]<deep[y])swap(x,y);fod(i,19,0)if(deep[f[x][i]]>deep[y])x=f[x][i];if(deep[x]>deep[y])x=f[x][0];fod(i,19,0)if(f[x][i]!=f[y][i])x=f[x][i],y=f[y][i];if(x!=y)return f[x][0];return x;
}
int ju(int x,int y){if(!x||!y)return 0;int z=lca(x,y);return deep[x]+deep[y]-2*deep[z];
}
void merge(node &x,node y,node z){int a,b,c,d,e,f;a=ju(y.yi,z.yi);b=ju(y.yi,z.er);c=ju(y.er,z.yi);d=ju(y.er,z.er);e=max(a,max(b,max(c,d)));if(!(e-a))x.yi=y.yi,x.er=z.yi,x.sum=a;if(!(e-b))x.yi=y.yi,x.er=z.er,x.sum=b;if(!(e-c))x.yi=y.er,x.er=z.yi,x.sum=c;if(!(e-d))x.yi=y.er,x.er=z.er,x.sum=d;if(y.sum>x.sum)x.yi=y.yi,x.er=y.er,x.sum=y.sum;if(z.sum>x.sum)x.yi=z.yi,x.er=z.er,x.sum=z.sum;if(!x.sum)x.yi=x.er=0;
}
void build(int x,int l,int r){if(l==r){t[x].yi=t[x].er=p[l];return;}int mid=(l+r)/2;build(x*2,l,mid);build(x*2+1,mid+1,r);merge(t[x],t[x*2],t[x*2+1]);
}
void find(int x,int l,int r,int y,int z){if(y>z)return;if(l==y&&r==z){merge(ans,ans,t[x]);return;}int mid=(l+r)/2;if(z<=mid)find(x*2,l,mid,y,z);else if(y>mid)find(x*2+1,mid+1,r,y,z);else{find(x*2,l,mid,y,mid);find(x*2+1,mid+1,r,mid+1,z);}
}
int main(){freopen("snow.in","r",stdin);freopen("snow.out","w",stdout);scanf("%d%d",&n,&q);fo(i,1,n-1){scanf("%d%d",&k,&l);add(k,l);add(l,k);}dfs(1,0);fo(j,1,19){fo(i,1,n)f[i][j]=f[f[i][j-1]][j-1];}build(1,1,n);for(;q;q--){scanf("%d%d",&k,&l);if(k==1||l==1){printf("0\n");continue;}if(wei[k]>wei[l])swap(k,l);ans.sum=ans.yi=ans.er=0;find(1,1,n,1,wei[k]-1);find(1,1,n,hou[k]+1,wei[l]-1);if(hou[k]>=hou[l])find(1,1,n,hou[k]+1,n);else find(1,1,n,hou[l]+1,n);printf("%d\n",ans.sum);}
}

【JZOJ4587】Snow的追寻相关推荐

  1. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  2. 为爱追寻_从机械师到编码员:追寻梦想如何改变了我的生活

    为爱追寻 by David Bruno 大卫·布鲁诺(David Bruno) 从机械师到编码员:追寻梦想如何改变了我的生活 (From mechanic to coder: how followin ...

  3. 在虚拟机中如何安装Mac OS X Snow Leopard 10.6

    前一段时间由于心血来潮,也由于在twitter上经常看到tinyfoo等大虾说苹果的优势.自己就先装个Mac OS系统学习一下,本人是狂热的小黑迷,原来在bestbuy和老婆在看Macbook Pro ...

  4. 追寻大师的脚步 | 张正友忆华人计算机视觉宗师 Thomas S. Huang

    2020-05-01 23:54 导语:编者按:美东时间2020 年 4 月 25 日夜间,计算机视觉之父,华人视觉一代宗师 Thomas S.Huang(黄煦涛)去世,享年 84 岁.黄煦涛先生一生 ...

  5. 追寻终极数据库 - 事务/分析混合处理系统的交付挑战 (1)

    追寻终极数据库 摇晃的数据库钟摆 IT行业的技术决策就像一只来回摇晃的钟摆. 大约十年前,新型网络公司开始收集比以往任何时候都更多的数据,他们迫切需要将数据库系统的扩展性能和处理性能提升到一个新的水平 ...

  6. 建议转变编程时的思维习惯改为:忽略细节关扰,直指问题核心,追寻问题关键。...

    建议转变编程习惯改为:忽略细节关扰,直指问题核心,追寻问题关键. 不要再沉溺于细节的理解,现在还不是时候.

  7. AWS — AWS Snow 系列

    目录 文章目录 目录 AWS Snow 系列 AWS Snowcone AWS Snowball AWS Snowmobile AWS Snow 系列 AWS Snow 系列可为需要在严峻的非数据中心 ...

  8. Codeforces Round #180 (Div. 2) A. Snow Footprints 贪心

    A. Snow Footprints 题目连接: http://www.codeforces.com/contest/298/problem/A Description There is a stra ...

  9. 2019 GDUT Rating Contest II : Problem G. Snow Boots

    题面: G. Snow Boots Input file: standard input Output file: standard output Time limit: 1 second Memory ...

  10. Codeforces Round #470 (rated, Div. 2 C. Producing Snow(思维)

    C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input standard in ...

最新文章

  1. 搞互联网研发,你真的懂HTTP Headers么?
  2. php免费iphp免费idede,闲鹤草邻
  3. STM32 基础系列教程 14 - IIC
  4. 显卡A卡和N卡有什么区别
  5. CS229 6.5 Neurons Networks Implements of Sparse Autoencoder
  6. javaweb应用开发与实践pdf_基于阿里云打造「云原生」Web应用——「懒猪行」Web应用开发实践...
  7. mysql 5.6密钥_MySQL的密钥文件不正确
  8. I2C和SPI注定要打一架
  9. 黑客入侵交警计算机系统删交通违法记录牟利
  10. 站内搜索引擎初探:haystack全文检索,whoosh搜索引擎,jieba中文分词
  11. 使用JDBC把Java连接到数据库
  12. 如何计算代码运行的时间?
  13. 固态硬盘怎么看出厂日期_如何查看SSD可以使用多长时间?固态硬盘寿命测试方法(全文)...
  14. php麻将,php实现麻将牌型的胡牌检测算法
  15. 打印机十大共性故障解决方法!!!
  16. Android开发实践:设计安卓应用以计算BMI指数
  17. php octet stream,为什么上传图片时,type 显示application/octet-stream 呢? 原
  18. Bzoj4567---背单词
  19. 模拟客服自动回复代码
  20. 中国无线蓝牙打印机行业市场供需与战略研究报告

热门文章

  1. qq飞车鸿蒙车队,qq飞车鸿蒙版
  2. 美敦力PB 560呼吸机设计方案(包含原理图+PCB+BOM表+CAD)
  3. Unity 贴图Meta文件的探究
  4. 《2021企业数智化转型升级创新服务企业》榜重磅发布
  5. 【学术相关】过来人对研究生阶段的学习建议
  6. Cousera - Deep Learning - 课程笔记 - Week 5
  7. html+txth换行,文本文档换行符号
  8. matlab矩形滤波器,MATLAB结合矩形窗设计FIR滤波器
  9. raid 物理盘缓存状态_查看RAID状态
  10. PHP在线考试系统源码 在线答题 在线批改