题意:有三种操作:

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 --树形转线性+并查集的更多相关文章

  1. Codeforces 466E Information Graph

    Information Graph 把询问离线之后就能随便搞了, 去check一下是不是祖先, 可以用倍增也能用dfs序. #include<bits/stdc++.h> #define ...

  2. Codeforces Round #582 (Div. 3)-G. Path Queries-并查集

    Codeforces Round #582 (Div. 3)-G. Path Queries-并查集 [Problem Description] 给你一棵树,求有多少条简单路径\((u,v)\),满足 ...

  3. Codeforces 938G(cdq分治+可撤销并查集+线性基)

    题意: 有一个无向连通图,支持三个操作: 1 x y d : 新建一条x和y的无向边,长度为d 2 x y    :删除x和y之间的无向边 3 x y    :询问x到y的所有路径中(可以绕环)最短的 ...

  4. Codeforces Beta Round #5 E. Bindian Signalizing 并查集

    E. Bindian Signalizing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...

  5. Codeforces Round #260 (Div. 1) C. Civilization 并查集,直径

    C. Civilization Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/probl ...

  6. Educational Codeforces Round 14 D. Swaps in Permutation (并查集orDFS)

    题目链接:http://codeforces.com/problemset/problem/691/D 给你n个数,各不相同,范围是1到n.然后是m行数a和b,表示下标为a的数和下标为b的数可以交换无 ...

  7. Codeforces 437D The Child and Zoo(贪心+并查集)

    题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...

  8. Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)

    D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: =  的情况我们用并查集把他们扔到一个集合,然后根据 > ...

  9. Educational Codeforces Round 14 D. Swaps in Permutation 并查集

    D. Swaps in Permutation 题目连接: http://www.codeforces.com/contest/691/problem/D Description You are gi ...

随机推荐

  1. 【CSS3】 理解CSS3 transform中的Matrix(矩阵)

    理解CSS3 transform中的Matrix(矩阵) by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu ...

  2. JavaScript 左右上下自动晃动,自动移动。

    最近做了一个项目,本来用css3动画做的,不兼容ie,用js做了个,分享给大家. 代码修改了下,上下左右四个模块,顺时针转动. <!DOCTYPE html> <html> & ...

  3. SAP 应用服务负载均衡的实现

         共两步,一是服务器的设置,二是客户端登陆设置.     先在SAP中使用SMLG 进行服务器分组.实例名是SAP系统中定义过的,你没法删也没改.(可能是俺不会,会的教教).我们先建一个Gro ...

  4. Web安全攻防-----TCP/IP安全篇

    知识点: 掌握TCP/IP的体系分层结构 掌握TCP/IP的各一层功能特点 掌握TCP/IP的数据在各层的名称 掌握TCP/IP的体系数据的封装和解封装 1.TCP/IP协议的历史 TCP/IP的起源 ...

  5. 操作系统开发系列—4.LDT

    一直以来,我们把所有的段描述符都放在GDT中,而不管它属于内核还是用户程序,为了有效地在任务之间实施隔离,处理器建议每个任务都应当具有自己的描述符表,称为局部描述符表LDT,并且把专属于自己的那些段放 ...

  6. Android 项目框架

  7. iOS 设备标识

    //UUID    NSLog(@"-=-=-=-=-=-=-=-==-=-==qqqqqqqqqqqqqqqqqqqqqqq:::::::::::%@", [[NSUUID UU ...

  8. 【原】ios打包ipa的四种实用方法(.app转.ipa)

    总结一下,目前.app包转为.ipa包的方法有以下几种: 1.Apple推荐的方式,即实用xcode的archive功能 Xcode菜单栏->Product->Archive->三选 ...

  9. JAVA 8 默认方法-Default Methods

    什么是默认方法-Default Methods 简单的说,就是可以在接口中定义一个已实现方法,且该接口的实现类不需要实现该方法: 如下示例: interface GreetingService { v ...

  10. Java触发器CronTrigger

    摘要:如果需要像日历那样按日程来触发任务,而不是像SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers通常比SimpleTrigger更有用. 一.web.xml: < ...