、这个集合点的选取一定有规律吧,于是秒猜结论:集合点一定在至少两个点的lca上

其实这是很显然的,因为如果不在两个点的lca上,那一定至少要花费2个点的移动而减少1个点的移动,这一定是不值的、

由于多次被卡rmq空间的经历所以就老老实实地写链剖lca了。。

码:

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define N 500005
int ans1,ans2,fu[N],top[N],sz[N],hson[N],d[N],n,m,i,a,b,c;
vector<int>v[N];
void dfs1(int o,int fa)
{fu[o]=fa;sz[o]=1;int i;for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fa)continue;dfs1(nd,o);if(sz[hson[o]]<sz[nd])hson[o]=nd;sz[o]+=sz[nd];    }
}
void dfs2(int o,int tap)
{int i;top[o]=tap;if(hson[o])dfs2(hson[o],tap);for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fu[o]||nd==hson[o])continue;dfs2(nd,nd);        }
}
void dfs(int o,int dis)
{d[o]=dis;int i;for(i=0;i<v[o].size();i++){int nd=v[o][i];if(nd==fu[o])continue;dfs(nd,dis+1);   }
}
int work(int x,int y)
{while(top[x]!=top[y]){if(d[top[x]]<d[top[y]])swap(x,y);    x=fu[top[x]];      }if(d[x]>d[y])swap(x,y); return x;
}
int main()
{scanf("%d%d",&n,&m);for(i=1;i<n;i++){scanf("%d%d",&a,&b);v[a].push_back(b);v[b].push_back(a);        }dfs1(1,0);dfs2(1,0);dfs(1,0);for(i=1;i<=m;i++){ans1=9999999;scanf("%d%d%d",&a,&b,&c);int lin;// a+b  clin=0;int lca=work(a,b);lin+=d[a]+d[b]-2*d[lca];lin+=d[lca]+d[c]-2*d[work(lca,c)];if(lin<ans1){ans1=lin;ans2=lca;    }// a+c blin=0;lca=work(a,c);lin+=d[a]+d[c]-2*d[lca];lin+=d[lca]+d[b]-2*d[work(lca,b)];if(lin<ans1){ans1=lin;ans2=lca;    }//c+b alin=0;lca=work(c,b);lin+=d[c]+d[b]-2*d[lca];lin+=d[lca]+d[a]-2*d[work(lca,a)];if(lin<ans1){ans1=lin;ans2=lca; }printf("%d %d\n",ans2,ans1);}
}

2017.9.21 紧急集合 思考记录相关推荐

  1. 2017.8.21 弦论 思考记录

    自己a的第一道sam  虽然是板子题 要求第k小的串,分两种情况: 一种是包括重复的: 包括重复的即包括right的size,所以每个点向它的父节点贡献自己的size即可,因为这个父指针和ac自动机的 ...

  2. 2017.10.28 压缩 思考记录

    这个题首先要知道M和R不是栈的搭配,是贪心的搭配,,就是向左找到第一个M.. 如 abababab cdcdcdcd abababab cdcdcdcd   = abRRcdcdcdcdR != Ma ...

  3. 2017.9.19 Gcd 思考记录

    一开始想错了 有时候还是要用欧拉函数的.. 用反演的话需要提取质数,比较麻烦, 先利用初中奥数分成gcd和两个质数,然后剩下的就是互质了 设i=gcd*a ,  j=gcd*b      , b> ...

  4. 2017.9.5 组合数学 思考记录

    这题风格很正统.所以我感觉如果自己能不靠题解把这个题做出来,那应该就学得不错了.. 于是在历尽千辛万苦之后,终于1A了.(事后证明 结论题的结论强行无视 乱搞也是有可能AC的) xym&ISA ...

  5. 2017.9.4 Nim 思考记录

    只要知道nim的结论   这题就是链剖板子题.1A 注意bzoj 的  换行符是     \r!!      \r!!      \r!! 就说一下链剖的易错点吧: 1.记录父节点.sz.深度 2.当 ...

  6. 2017.10.28 排序 思考记录

    这个题有一种套路,就是大小关系转化成01串,这样就变成了二分检验问题,, 就是把排序变成区间修改,然后单点查询.. 把所有比他小的赋成0,比他大的赋成1 然后判断要求位是0还是1来判断答案与当前值的大 ...

  7. 2017.10.6 单词 思考记录

    少有的会做的ac自动机题 .这个题是匹配模式串. 所以就不需要匹配的过程,只需要建出fail树,然后直接拓扑 由于每次加进去一个单词,这个单词的每一个字母都有可能作为最后一个字母影响他的失配,所以词路 ...

  8. 2017.10.5 高速公路 思考记录

    ..一开始死活不知道样例8/3是怎么算出来的.. 后来才发现右端点要-1.. 这个题说是期望,但因为每个点的概率相同,所以直接求和然后除就可以了 维护每个区间的答案,听说直接维护答案很难写,,感觉还可 ...

  9. 2017.10.1 蚯蚓 思考记录

    现在看来这个题真心不难. 如果能保证一个从大到小的顺序的话,对所有的数依次进行相同比例的分裂操作,左右两边一定也是单调的 由于每次要+q,等价于取出元素-q,这在式子里是不影响大小关系的 所以就sor ...

最新文章

  1. c语言 打开文件夹空格,关于文件操作,碰到空格就换行
  2. Android内存分析和调优
  3. app.vue里使用data_Yeoman自定义Generator使用案例及Plop的使用
  4. fastdfs上传文件时候报错
  5. java csv下载_java 生成csv文件,弹出下载对话框。。。
  6. bootstrap中导航、导航栏、表单及自定义表单
  7. Theano模块的安装其实没你想的那么难
  8. 第二十讲、迭代器模式
  9. Linux高级编程--06.进程概述
  10. forEach,for in,for of循环的用法
  11. MySQL存储引擎InnoDB、MyISAM 、其它存储引擎介绍
  12. python多线程实现同时下载_Python实现多线程下载
  13. IT运维岗位可以分为哪几种?10个运维岗详解
  14. 上海科技大学计算机夏令营随笔
  15. 移动游戏运营必备的数据分析指标
  16. C# 二维与三维计算多边形面积的方法
  17. 基于Angularjs框架实现HTML5在线查看OFD文件
  18. 基于AI的恶意样本分析(2)
  19. 【学习总结】ctf隐写初阶解题思路与方法
  20. 怎样使用word模板?两分钟教你搞定!

热门文章

  1. Java虚拟机------JVM介绍
  2. 如何读取tensorboard文件 展现可视化
  3. iphone分辨率_揭示真实的手机屏幕大小和分辨率
  4. Eclipse设置断点进行调试
  5. Python中break和continue语句及循环中的else子句
  6. python3x_Python3x 基本知识点
  7. vue中button如何改变文字的大小_Vue进阶属性
  8. linux qt交叉编译opencv,c-使用Qt和opencv交叉编译到Raspberry Pi
  9. php函数clean(),wordpress函数clean_url()用法示例
  10. 拆除指令怎么设置_siri叫你起床啦~早安等快捷指令你会用了吗i