12 2017 档案
摘要:题目大意:给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 题解:有多种做法 倍增:(写于2017-9-13) bfs函数:处理每个节点的深度(其实dfs更常用,当时我用的是bfs)和父亲(dad[i][0]) init函数:处理每个节点的二的整数幂的父亲,dad[i][j]存的是第i个节点
阅读全文
摘要:题目大意:树链剖分,有4个操作,1:把x->y路径上值都加上z,2:求x->y路径上值之和,3:把x的子树值都加上z,4:求x的子树值之和 题解:树链剖分,就是对一棵树分成几条链,把树形变为线性,减少处理难度 具体每个函数的作用见程序 C++ Code:
阅读全文
摘要:题目大意:给你n个数,要求输出其中前1,3,……,2k-1个数的中位数题解:第一个中位数是第一个数,每次读两个数,若一小一个大,那么不变;若大大,中位数变成比他小的最大数;反之,中位数变成比他大的最小数。然后可以用一个大根堆和一个小根堆维护(代码中small为比现中位数小的数,即大根堆;big为比现
阅读全文
摘要:题目大意:有30000个船,第i个船在第i列,两个操作,M:把第i列的船整体拼到第j列船后,C:求第i和第j个船之间的船的个数题解:可以想到用并查集,在基础的并查集上增加路径,用num数组存第i个船到队首的距离,用len存这一列的船的个数。问题主要在路径压缩上维护num数组上。可以在find的过程中
阅读全文
摘要:题目大意:有n个人,关系为:朋友的朋友是朋友,敌人的敌人是朋友。如果是朋友就在一个团队内,是敌人就不在,现在给出一关系,问最多有多少团伙。题解:并查集,建反集,如果是朋友,就把他们的并查集合并;如果是敌人,就把他们分别和对方的反集合并,统计最后有几个联通块 C++ Code:
阅读全文
摘要:题目大意:有一个无向图,依次击破一些点,求每次击破后的联通块个数题解:离线解决,把击破变成添加,倒着处理,每次添加节点时把与它相连的边加入图中,用并查集维护,求出答案 C++ Code:
阅读全文