2017.9.21 紧急集合 思考记录
、这个集合点的选取一定有规律吧,于是秒猜结论:集合点一定在至少两个点的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 紧急集合 思考记录相关推荐
- 2017.8.21 弦论 思考记录
自己a的第一道sam 虽然是板子题 要求第k小的串,分两种情况: 一种是包括重复的: 包括重复的即包括right的size,所以每个点向它的父节点贡献自己的size即可,因为这个父指针和ac自动机的 ...
- 2017.10.28 压缩 思考记录
这个题首先要知道M和R不是栈的搭配,是贪心的搭配,,就是向左找到第一个M.. 如 abababab cdcdcdcd abababab cdcdcdcd = abRRcdcdcdcdR != Ma ...
- 2017.9.19 Gcd 思考记录
一开始想错了 有时候还是要用欧拉函数的.. 用反演的话需要提取质数,比较麻烦, 先利用初中奥数分成gcd和两个质数,然后剩下的就是互质了 设i=gcd*a , j=gcd*b , b> ...
- 2017.9.5 组合数学 思考记录
这题风格很正统.所以我感觉如果自己能不靠题解把这个题做出来,那应该就学得不错了.. 于是在历尽千辛万苦之后,终于1A了.(事后证明 结论题的结论强行无视 乱搞也是有可能AC的) xym&ISA ...
- 2017.9.4 Nim 思考记录
只要知道nim的结论 这题就是链剖板子题.1A 注意bzoj 的 换行符是 \r!! \r!! \r!! 就说一下链剖的易错点吧: 1.记录父节点.sz.深度 2.当 ...
- 2017.10.28 排序 思考记录
这个题有一种套路,就是大小关系转化成01串,这样就变成了二分检验问题,, 就是把排序变成区间修改,然后单点查询.. 把所有比他小的赋成0,比他大的赋成1 然后判断要求位是0还是1来判断答案与当前值的大 ...
- 2017.10.6 单词 思考记录
少有的会做的ac自动机题 .这个题是匹配模式串. 所以就不需要匹配的过程,只需要建出fail树,然后直接拓扑 由于每次加进去一个单词,这个单词的每一个字母都有可能作为最后一个字母影响他的失配,所以词路 ...
- 2017.10.5 高速公路 思考记录
..一开始死活不知道样例8/3是怎么算出来的.. 后来才发现右端点要-1.. 这个题说是期望,但因为每个点的概率相同,所以直接求和然后除就可以了 维护每个区间的答案,听说直接维护答案很难写,,感觉还可 ...
- 2017.10.1 蚯蚓 思考记录
现在看来这个题真心不难. 如果能保证一个从大到小的顺序的话,对所有的数依次进行相同比例的分裂操作,左右两边一定也是单调的 由于每次要+q,等价于取出元素-q,这在式子里是不影响大小关系的 所以就sor ...
最新文章
- c语言 打开文件夹空格,关于文件操作,碰到空格就换行
- Android内存分析和调优
- app.vue里使用data_Yeoman自定义Generator使用案例及Plop的使用
- fastdfs上传文件时候报错
- java csv下载_java 生成csv文件,弹出下载对话框。。。
- bootstrap中导航、导航栏、表单及自定义表单
- Theano模块的安装其实没你想的那么难
- 第二十讲、迭代器模式
- Linux高级编程--06.进程概述
- forEach,for in,for of循环的用法
- MySQL存储引擎InnoDB、MyISAM 、其它存储引擎介绍
- python多线程实现同时下载_Python实现多线程下载
- IT运维岗位可以分为哪几种?10个运维岗详解
- 上海科技大学计算机夏令营随笔
- 移动游戏运营必备的数据分析指标
- C# 二维与三维计算多边形面积的方法
- 基于Angularjs框架实现HTML5在线查看OFD文件
- 基于AI的恶意样本分析(2)
- 【学习总结】ctf隐写初阶解题思路与方法
- 怎样使用word模板?两分钟教你搞定!
热门文章
- Java虚拟机------JVM介绍
- 如何读取tensorboard文件 展现可视化
- iphone分辨率_揭示真实的手机屏幕大小和分辨率
- Eclipse设置断点进行调试
- Python中break和continue语句及循环中的else子句
- python3x_Python3x 基本知识点
- vue中button如何改变文字的大小_Vue进阶属性
- linux qt交叉编译opencv,c-使用Qt和opencv交叉编译到Raspberry Pi
- php函数clean(),wordpress函数clean_url()用法示例
- 拆除指令怎么设置_siri叫你起床啦~早安等快捷指令你会用了吗i