CodeForces 466E Information Graph --树形转线性+并查集
题意:有三种操作:
1.新增一条边从y连向x,此前x没有父节点
2.x接到一份文件,(文件标号逐次递增),然后将这份文件一路上溯,让所有上溯的节点都接到这份文件
3.查询某个节点x是否接到过文件F
解法:
首先要知道一个性质,节点u在v的上溯路径上的话要满足: L[u]<=L[v] && R[u] >= R[v] (先进后出)
先将所有的边都读入,dfs得出L[u],R[u],然后将查询分为tot类(tot=总文件种数),记录每一类有那些地方查询了,然后如果type=2,那么记录这个type=2现在是第几类文件,都存下来以后备用。
再从1枚举到m,枚举每个输入,
如果type=1,那么将x,y集合合并,就算是建立了父子关系。
如果type=2,那么先得出现在得到的文件种类,再得到这个种类的所有查询,处理所有查询,得到u,v,先判断是否在一个集合中,然后再进行L[u]<=L[v] && R[u] >= R[v] 的判断,如果成立,说明u接到了v传来的该种类的文件。
如果type=3,先不处理,但是按照题意,也可以直接输出了。
最后输出。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;
#define N 100107 vector<int> G[N],query[N];
int fa[N],L[N],R[N],vis[N],Time,doc[N],f[N];
struct node{
int op,x,y;
}Q[N]; int findset(int x) {
if(x != fa[x]) fa[x] = findset(fa[x]);
return fa[x];
} void dfs(int u) {
vis[u] = ;
L[u] = ++Time;
for(int i=;i<G[u].size();i++) {
int v = G[u][i];
dfs(v);
}
R[u] = ++Time;
} int main()
{
int n,m,i,op,DOC = ,docnum;
memset(vis,,sizeof(vis));
scanf("%d%d",&n,&m);
for(i=;i<=n;i++) fa[i] = i;
for(i=;i<=m;i++) {
scanf("%d",&Q[i].op);
if(Q[i].op == ) {
scanf("%d%d",&Q[i].x,&Q[i].y);
G[Q[i].y].push_back(Q[i].x);
vis[Q[i].x] = ;
}
else if(Q[i].op == ) {
scanf("%d",&Q[i].x);
doc[i] = ++DOC; //第i个查询是查询第DOC种文档
}
else {
scanf("%d%d",&Q[i].x,&docnum);
query[docnum].push_back(i); //查询第docnum种文档的查询标号
}
}
Time = ;
memset(f,,sizeof(f));
for(i=;i<=n;i++)
if(!vis[i]) dfs(i); //处理出L[u],R[u]
for(i=;i<=m;i++) {
if(Q[i].op == ) {
int fx = findset(Q[i].x);
int fy = findset(Q[i].y);
fa[fx] = fy;
}
else if(Q[i].op == ) {
int now = doc[i]; //是第几种文档
int v = Q[i].x; //最底层签发者
for(int j=;j<query[now].size();j++) {
int ind = query[now][j];
int u = Q[ind].x; //查询目标
if(findset(u) == findset(v) && L[u] <= L[v] && R[u] >= R[v])
f[ind] = ;
}
}
}
for(i=;i<=m;i++) if(Q[i].op == ) {
if(f[i]) puts("YES");
else puts("NO");
}
return ;
}
CodeForces 466E Information Graph --树形转线性+并查集的更多相关文章
- Codeforces 466E Information Graph
Information Graph 把询问离线之后就能随便搞了, 去check一下是不是祖先, 可以用倍增也能用dfs序. #include<bits/stdc++.h> #define ...
- Codeforces Round #582 (Div. 3)-G. Path Queries-并查集
Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...
- Codeforces 938G(cdq分治+可撤销并查集+线性基)
题意: 有一个无向连通图,支持三个操作: 1 x y d : 新建一条x和y的无向边,长度为d 2 x y :删除x和y之间的无向边 3 x y :询问x到y的所有路径中(可以绕环)最短的 ...
- Codeforces Beta Round #5 E. Bindian Signalizing 并查集
E. Bindian Signalizing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...
- Codeforces Round #260 (Div. 1) C. Civilization 并查集,直径
C. Civilization Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/probl ...
- Educational Codeforces Round 14 D. Swaps in Permutation (并查集orDFS)
题目链接:http://codeforces.com/problemset/problem/691/D 给你n个数,各不相同,范围是1到n.然后是m行数a和b,表示下标为a的数和下标为b的数可以交换无 ...
- Codeforces 437D The Child and Zoo(贪心+并查集)
题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...
- Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)
D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: = 的情况我们用并查集把他们扔到一个集合,然后根据 > ...
- Educational Codeforces Round 14 D. Swaps in Permutation 并查集
D. Swaps in Permutation 题目连接: http://www.codeforces.com/contest/691/problem/D Description You are gi ...
随机推荐
- Font Combiner – 自定义网页字体和图标生成工具
Font Combiner 是一个功能丰富的 Web 字体生成工具和字体改进工具,提供字距调整.构造子集.各种提示选项和自定义字体字形组合.您可以生成您自己的自定义字体的格式和文件大小. 另外还有成千 ...
- 众人口中的JAVASCRIPT
目前所说的JAVASCRIPT=ECMAscript+DOM+BOM DOM全称:Document Object Model,造作网页内容的标准. BOM全称:Browse Object Model, ...
- array's filter
var arr = [ { id: 15 }, { id: -1 }, { id: 0 }, { id: 3 }, { id: 12.2 }, { }, { id: null }, { id: NaN ...
- Javascript Object、Function对象
1.Object对象 原型对象 原型是对象的一个属性,也就是prototype属性,每个对象都有这个内部属性,而且他本身也是一个对象. <script type="text/javas ...
- Delphi 时间耗时统计
处理事情: 数据处理过程中,速度很慢,无法准确定位分析是DB问题还是客户端处理问题,所以增加计时统计日志: Delphi计时首次使用,查阅资料,予以记录: var BgPoint, EdPoind: ...
- 谈谈JavaScript类型检测
javascript内置的类型检测机制并非完全可靠.比如typeof操作符,并不能准确的判断数据是哪个类型,比如:数组和对象就不能通过typeof来区分. typeof [] ==="o ...
- 如何让光标处于EditText的末尾
经测试发现,如果EditText预先有内容,光标自然会在文字的末尾 . 但是如果预先内容为空,然后设置好内容,这种情况下光标自然会在文字的开头,所以这种情况下可以这样做让光标位于末尾: editTex ...
- Swift开发第九篇——Any和AnyObject&typealias和泛型接口
本篇分为两部分: 一.Swift中的Any和AnyObject 二.Swift中的typealias和泛型接口 一.Swift中的Any和AnyObject 在 Swift 中,AnyObject 可 ...
- IOS开发之待探究随录
设置导航条的问题
- MySQL出现Waiting for table metadata lock的原因以及解决方法
转自:http://ctripmysqldba.iteye.com/blog/1938150 (有修改) MySQL在进行alter table等DDL操作时,有时会出现Waiting for tab ...