466E - Information Graph 巧妙的判断祖先于孩子的关系
这题说的是给了一个公司员工100000 然后现在又3种操作第一种将y置为x的父亲,第二种操作将文件给第x个人签他签完给他的上司签,一直到没有上司为止,第三种操作问x是否签了第i份文件,然后 我们只要直到每两个点在最后形成的这颗树的位置只有祖先关系第一类 叔叔兄弟和其他的归为另一类,然后我们通过并查集判断他们是否在同一颗树中如果在判断他们的关系可以用刚刚处理出来的关系
处理这个关系用的是 访问的时间差可以判断是否为这个节点的孩子 看下面的代码 tin[x]<=tin[y]&&tou[x]>=tou[y] 那么y一定是x的孩子或者是x
#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn =;
int tin[maxn],tou[maxn];
int tag[maxn];
vector<int>F[maxn];
int op[maxn],x[maxn],y[maxn];
int qusetion[maxn],time;
vector<int>ansquestion[maxn];
void dfs(int v, int p=-){
tin[v]=time++;
int L=F[v].size();
for(int i=; i<L; ++i){
int to = F[v][i];
if(to==p) continue;
dfs(to,v);
}
tou[v]=time++;
}
int per[maxn];
int fa(int a){
return per[a]= a==per[a]?a:fa(per[a]);
}
void unin(int a, int b){
a=fa(a); b=fa(b);
if(a!=b) per[a]=b;
}
bool ans[maxn];
int paatt(int a,int b){
return tin[a]<=tin[b]&&tou[a]>=tou[b];
}
int main()
{
memset(ans,false,sizeof(ans));
int n,m,number=;
scanf("%d%d",&n,&m);
for(int i=; i<m; ++i){
scanf("%d",&op[i]);
if(op[i]==){
scanf("%d",&x[i]);
}else scanf("%d%d",&x[i],&y[i]);
if(op[i]==){
F[y[i]].push_back(x[i]);
tag[x[i]]++;
}else if(op[i]==){
qusetion[i]=++number;
}else {
ansquestion[y[i]].push_back(i);
}
}
time=;
for(int i=; i<=n; ++i){
if(tag[i]!=||tin[i]!=) continue;
dfs(i);
}
for(int i=; i<=n; ++i)
per[i]=i; for(int i=; i<m; ++i){
if(op[i]==){ unin(x[i],y[i]);
}else if(op[i]==){
int an= qusetion[i];
int root=x[i];
int L = ansquestion[an].size();
for(int j=; j<L; ++j){
int to = ansquestion[an][j];
int in=x[to];
ans[to]=fa(in)==fa(root)&&paatt(in,root);
}
}
}
for(int i=; i<m; ++i)
if(op[i]==)
printf("%s\n",ans[i]?"YES":"NO");
return ;
}
466E - Information Graph 巧妙的判断祖先于孩子的关系的更多相关文章
- Codeforces 466E Information Graph
Information Graph 把询问离线之后就能随便搞了, 去check一下是不是祖先, 可以用倍增也能用dfs序. #include<bits/stdc++.h> #define ...
- CodeForces 466E Information Graph --树形转线性+并查集
题意:有三种操作: 1.新增一条边从y连向x,此前x没有父节点 2.x接到一份文件,(文件标号逐次递增),然后将这份文件一路上溯,让所有上溯的节点都接到这份文件 3.查询某个节点x是否接到过文件F 解 ...
- Codeforces 466 E. Information Graph
并查集.... E. Information Graph time limit per test 1 second memory limit per test 512 megabytes input ...
- Broken line - SGU 124(判断点与多边形的关系)
题目大意:RT 分析:构造一条射线,如果穿越偶数条边,那么就在多边形外面,如果穿越奇数条边,那么就在多边形里面. 代码如下: ===================================== ...
- C# GDI+ 利用 Rectangle GraphicsPath 判断 矩形或多边形 图形关系
最近在做一些简单的图像对比工作,总结了一些GDI+对象的使用方式,记录下来共享给大家使用. 判断Rectangl与多边形的关系 /// <summary> /// 是否包含输入范围 /// ...
- .NET(C#):判断Type类的继承关系
//Type类的函数 class Type bool IsInstanceOfType(object); //判断对象是否是指定类型 //类型可以是父类,接口 //用法:父类.IsInstanceOf ...
- 在ios开发中nil和NUll和Nilde区别————和如何判断连个对象的关系和UISlider不能拖动的问题
nil表示一个对象指针为空,针对对象 >示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; ...
- [置顶] 如何判断两个IP大小关系及是否在同一个网段中
功能点 判断某个IP地址是否合法 判断两个IP地址是否在同一个网段中 判断两个IP地址的大小关系 知识准备 IP协议 子网掩码 Java 正则表达式 基本原理 IP地址范围 0.0.0.0- 255 ...
- POJ2318 TOYS(叉积判断点与直线的关系+二分)
Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...
随机推荐
- java日志之log4j简单使用
1.导入包log4j.jar 2.src同级创建并设置log4j.properties ### 设置### log4j.rootLogger = debug,stdout,D,E ### 输出信息到控 ...
- 查看网卡流量:nload
nload命令用于查看网卡流量,用法如下: [root@localhost ~]$ yum install -y epel-release [root@localhost ~]$ yum instal ...
- 解决Qt程序在Linux下无法输入中文的办法(与下文连接)
在安装QT集成开发工具包之前需要先安装build-essential和libncurses5-dev这两个开发工具和库,libncurses5-dev库是一个在Linux/Unix下广泛应用的图形函数 ...
- C语言简介(转自菜鸟教程)
C 简介 C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的.C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现. 在 1978 ...
- jQuery中的$.each的用法
$.each(Array,function(i,value){ this; //this指向当前对象 i; //i表示当前下标 value; //value表示当前元素 })
- MQTT协议笔记之连接和心跳
前言 本篇会把连接(CONNECT).心跳(PINGREQ/PINGRESP).确认(CONNACK).断开连接(DISCONNECT)和在一起. CONNECT 像前面所说,MQTT有关字符串部分采 ...
- jquery类似方法的比较(三)
属性选择器 1.$("div[class|='test']")可以选择 class为test的div 和 class以“test-”开头的div. 2.$("div[cl ...
- 正则表达式—RegEx(RegularExpressio)(三)
今日随笔,继续写一点关于正则表达式的 知识.前两天介绍了正则表达式验证匹配,提取等一些基本的知识,今天继续分享下它的另一个强大的应用:替换(replace). 开始之前,还是要补一下昨天的内容. 在我 ...
- go练习2-go的学习资料
好吧 我承认,有自己添加的内容也有从别人的blog 中 ctrl + c 的 官方:http://golang.org ,经常被封 中文手册的翻译:http://code.google.com/p/g ...
- oracle的connect by level的示例
SELECT regexp_substr('CITY_AA,CITY_BB,CITY_CC,CITY_DD', '[^,]+', 1, LEVEL) t FROM dualCONNECT BY reg ...