题意: 给你一颗N个节点的树,节点编号1到N.1总是节点的根.现在有两种操作: M v: 标记节点v Q v: 求出离v最近的标记的相邻节点.根节点一开始就标记好了. 现在给一系列操作,求出所有Q操作结果的和. 思路: 最坏情况下为整棵树成为一条链,单纯使用并查集(无压缩)查询复杂度最坏1e10.单纯使用并查集也能过. 正解应该是将查询存下来,存下每次Q操作的查询时间和查询结点,用qt和qv数组存储.另外设置mark数组存储这个结点被染色的最快时间.然后我们倒着进行查询操作,当当前查询的结点最早…
寻找根节点很容易让人联想到DisjointSet,但是DisjointSet只有合并操作, 所以询问离线倒着考虑,标记会一个一个消除,这时候就变成合并了. 因为询问和查询的时间以及标记生效的时间有关,记录下查询时间,在树上记录的标记.(没有做标记的默认为最大询问时间+1,根节点为0 在Find的时候根据询问的时间进行回答. 路径压缩会影响到答案吗?并不会,因为压缩的时候,标记一定已经失效了. (答案会爆int,这种问题无非就是在路径上做一些改动,类似比如UVA 11987 Almost Unio…
题意:出一颗树,有两种操作:1. mark  u  标记结点u2.query  u  询问离u最近的且被标记的祖先结点是哪个让你输出所有询问的和. 思路:数据量太小,直接暴力dfs就可以了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<vector> #include<set>…
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45522 给定一棵树的n个节点,每个节点标号在1到n之间,1是树的根节点,有如下两种操作: M v :把编号为v的节点标记. Q v :查询与v节点距离最近的被标记的点的编号.最初只有根节点被标记. 输入n-1个数表示,每一个数是当前第i个数的父节点,输出对于每个查询得到标号的总和. 并查集与树的结合,在输入的时候就可以根据父节点的关系建立并查集,1的父亲是1. 还有把编号为…
Aizu - 2564 Tree Reconstruction 题意:一个有向图,要使得能确定每一条边的权值,要求是每个点的入权和出权相等,问你最少需要确定多少条边 思路:这题好像有一个定理之类的,对于每一个连通块,所需要的边数是 M-N(边数-点数) ,这个原理我还不是很清楚. 知道了这个之后,并查集求一下就完事了. 这题我大致看了一下官方 的提交记录,发现有好多种方法可以搞.23:48:40 #pragma comment(linker, "/STACK:1000000000")…
The Suspects   Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 20596   Accepted: 9998 Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003.…
A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28703   Accepted: 9350 Description Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different gender…
题意: 有一个树,有些节点染色,每次有两种操作,第一,统计该节点到离它最近的染色父亲结点的的号码(Q),第二,为某一个节点染色(M),求第一种操作和. 输入: 输入由多个数据集组成.每个数据集都有以下格式:输入的第一行包含两个整数N和Q,分别表示树T中的节点数和操作数.这些数字满足以下条件:1≤N≤100000和1≤Q≤100000.下面的N-1行,每行包含一个整数pi(i = 2,...,N),它表示第i个节点的父节点的编号.接下来的Q行按顺序包含操作.每个操作都格式化为“M v”或“Q v”…
https://vjudge.net/problem/Aizu-2170 并查集用于管理元素分组情况. 建树pre[]记录父节点,一开始只有结点1被标记了,所以find()最终得到的根都是1. 如果遇到M操作,即将树断开(很神奇的操作). #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorithm> #include<cma…
需要变形的并查集,这题错了好久,一直没a掉,终于在重写第三次的时候a了 先保存数据,把不需要拆分的边合并,逆向计算,需要拆分时就合并,之前不知道为啥写搓了,tle好久 #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<iomanip…