寻找根节点很容易让人联想到DisjointSet,但是DisjointSet只有合并操作,

所以询问离线倒着考虑,标记会一个一个消除,这时候就变成合并了。

因为询问和查询的时间以及标记生效的时间有关,记录下查询时间,在树上记录的标记。(没有做标记的默认为最大询问时间+1,根节点为0

在Find的时候根据询问的时间进行回答。

路径压缩会影响到答案吗?并不会,因为压缩的时候,标记一定已经失效了。

(答案会爆int,这种问题无非就是在路径上做一些改动,类似比如UVA 11987 Almost Union-Find。分开操作,一般都逆序变成合并

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
//#include<bits/stdc++.h>
using namespace std; const int maxn = 1e5+;
int pa[maxn];
int Mrk[maxn]; int qt[maxn],qv[maxn];
int Qt;
int fdst(int x)
{
return Mrk[x] < Qt ? x :pa[x] = fdst(pa[x]);
} //#define LOCAL
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int N, Q;
while(scanf("%d%d",&N,&Q),N){
for(int i = ; i <= N; i++){
scanf("%d",pa+i);
Mrk[i] = Q+;
}
int c = ;
for(int i = ; i <= Q; i++){
char op[];
int v;
scanf("%s%d",op,&v);
if(*op == 'Q'){
qt[c] = i;
qv[c++] = v;
}else {
Mrk[v] = min(Mrk[v],i);//取最早生效的标记
}
}
long long ans = ;
while(c--){
Qt = qt[c];
ans += fdst(qv[c]);
}
printf("%lld\n",ans);
}
return ;
}

Aizu 2170 Marked Ancestor(并查集变形)的更多相关文章

  1. AOJ 2170 Marked Ancestor[并查集][离线]

    题意: 给你一颗N个节点的树,节点编号1到N.1总是节点的根.现在有两种操作: M v: 标记节点v Q v: 求出离v最近的标记的相邻节点.根节点一开始就标记好了. 现在给一系列操作,求出所有Q操作 ...

  2. Aizu 2170 Marked Ancestor

    题意:出一颗树,有两种操作:1. mark  u  标记结点u2.query  u  询问离u最近的且被标记的祖先结点是哪个让你输出所有询问的和. 思路:数据量太小,直接暴力dfs就可以了 #incl ...

  3. AOJ 2170 Marked Ancestor (基础并查集)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=45522 给定一棵树的n个节点,每个节点标号在1到n之间,1是树的根节点,有如 ...

  4. Aizu - 2564 Tree Reconstruction 并查集

    Aizu - 2564 Tree Reconstruction 题意:一个有向图,要使得能确定每一条边的权值,要求是每个点的入权和出权相等,问你最少需要确定多少条边 思路:这题好像有一个定理之类的,对 ...

  5. poj 1611 The Suspects 并查集变形题目

    The Suspects   Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 20596   Accepted: 9998 D ...

  6. poj2492--A Bug&#39;s Life(并查集变形)

    A Bug's Life Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 28703   Accepted: 9350 De ...

  7. Marked Ancestor [AOJ2170] [并查集]

    题意: 有一个树,有些节点染色,每次有两种操作,第一,统计该节点到离它最近的染色父亲结点的的号码(Q),第二,为某一个节点染色(M),求第一种操作和. 输入: 输入由多个数据集组成.每个数据集都有以下 ...

  8. Aizu2170 Marked Ancestor(并查集)

    https://vjudge.net/problem/Aizu-2170 并查集用于管理元素分组情况. 建树pre[]记录父节点,一开始只有结点1被标记了,所以find()最终得到的根都是1. 如果遇 ...

  9. zoj3261变形并查集

    需要变形的并查集,这题错了好久,一直没a掉,终于在重写第三次的时候a了 先保存数据,把不需要拆分的边合并,逆向计算,需要拆分时就合并,之前不知道为啥写搓了,tle好久 #include<map& ...

随机推荐

  1. 笔记:eclipse的findbugs插件安装成功却不显示

    关键字:findbugs eclipse的findbugs插件安装成功却不显示的原因有: 1.插件版本太高,低版本的eclipse不兼容 2.也有可能是JDK版本低 findbugs安装方法: 1.在 ...

  2. Zookeeper下载方法

    Zookeeper官网地址:http://zookeeper.apache.org/             Zookeeper下载链接:http://mirrors.tuna.tsinghua.ed ...

  3. dblink 简单使用

    create extension dblink查看连接:select dblink_get_connections()断开所有连接:select dblink_disconnect()断开指定名称的连 ...

  4. springIOC源码解析之BeanDefinition的注册

    ApplicationContext类结构 context是一个存储上下文结构的东西,里面会引用BeanFactory  BeanFactory类结构 我们从这句代码开始分析,(本文spring采用的 ...

  5. Oracle 11g 数据类型

    1.     字符类型 数据类型 长度 说明 CHAR(n BYTE/CHAR) 默认1字节,n值最大为2000 末尾填充空格以达到指定长度,超过最大长度报错.默认指定长度为字节数,字符长度可以从1字 ...

  6. js千分位处理

    一.去掉千分位 function removeThousands(num) { var x = num.split(','); return parseFloat(x.join("" ...

  7. BZOJ 4260 Codechef REBXOR 01trie

    好题...开阔思路 把每个前缀异或和依次插入$01trie$,插之前找一个最优的(就是从高位向低位贪心,尽量走相反方向)看看能不能更新答案,此时相当于找到了区间右端点不超过某个点$r$的最大或和$f[ ...

  8. nginx配置openssl证书

    引用出处: https://blog.csdn.net/liuchunming033/article/details/48470575 证书生成基本步骤: 生成私钥(.key)-->生成证书请求 ...

  9. AJAX下拉框联动

    function getProvince() { var ProName = $("#dvProv").val(); LoadProvince(ProName); } functi ...

  10. 004 Median of Two Sorted Arrays 两个有序数组的中位数

    There are two sorted arrays nums1 and nums2 of size m and n respectively.Find the median of the two ...