这题说的是给了一个公司员工100000 然后现在又3种操作第一种将y置为x的父亲,第二种操作将文件给第x个人签他签完给他的上司签,一直到没有上司为止,第三种操作问x是否签了第i份文件,然后 我们只要直到每两个点在最后形成的这颗树的位置只有祖先关系第一类   叔叔兄弟和其他的归为另一类,然后我们通过并查集判断他们是否在同一颗树中如果在判断他们的关系可以用刚刚处理出来的关系

处理这个关系用的是 访问的时间差可以判断是否为这个节点的孩子 看下面的代码 tin[x]<=tin[y]&&tou[x]>=tou[y] 那么y一定是x的孩子或者是x

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string.h>
  4. #include <algorithm>
  5. #include <vector>
  6. using namespace std;
  7. const int maxn =;
  8. int tin[maxn],tou[maxn];
  9. int tag[maxn];
  10. vector<int>F[maxn];
  11. int op[maxn],x[maxn],y[maxn];
  12. int qusetion[maxn],time;
  13. vector<int>ansquestion[maxn];
  14. void dfs(int v, int p=-){
  15. tin[v]=time++;
  16. int L=F[v].size();
  17. for(int i=; i<L; ++i){
  18. int to = F[v][i];
  19. if(to==p) continue;
  20. dfs(to,v);
  21. }
  22. tou[v]=time++;
  23. }
  24. int per[maxn];
  25. int fa(int a){
  26. return per[a]= a==per[a]?a:fa(per[a]);
  27. }
  28. void unin(int a, int b){
  29. a=fa(a); b=fa(b);
  30. if(a!=b) per[a]=b;
  31. }
  32. bool ans[maxn];
  33. int paatt(int a,int b){
  34. return tin[a]<=tin[b]&&tou[a]>=tou[b];
  35. }
  36. int main()
  37. {
  38. memset(ans,false,sizeof(ans));
  39. int n,m,number=;
  40. scanf("%d%d",&n,&m);
  41. for(int i=; i<m; ++i){
  42. scanf("%d",&op[i]);
  43. if(op[i]==){
  44. scanf("%d",&x[i]);
  45. }else scanf("%d%d",&x[i],&y[i]);
  46. if(op[i]==){
  47. F[y[i]].push_back(x[i]);
  48. tag[x[i]]++;
  49. }else if(op[i]==){
  50. qusetion[i]=++number;
  51. }else {
  52. ansquestion[y[i]].push_back(i);
  53. }
  54. }
  55. time=;
  56. for(int i=; i<=n; ++i){
  57. if(tag[i]!=||tin[i]!=) continue;
  58. dfs(i);
  59. }
  60. for(int i=; i<=n; ++i)
  61. per[i]=i;
  62.  
  63. for(int i=; i<m; ++i){
  64. if(op[i]==){
  65.  
  66. unin(x[i],y[i]);
  67. }else if(op[i]==){
  68. int an= qusetion[i];
  69. int root=x[i];
  70. int L = ansquestion[an].size();
  71. for(int j=; j<L; ++j){
  72. int to = ansquestion[an][j];
  73. int in=x[to];
  74. ans[to]=fa(in)==fa(root)&&paatt(in,root);
  75. }
  76. }
  77. }
  78. for(int i=; i<m; ++i)
  79. if(op[i]==)
  80. printf("%s\n",ans[i]?"YES":"NO");
  81. return ;
  82. }

466E - Information Graph 巧妙的判断祖先于孩子的关系的更多相关文章

  1. Codeforces 466E Information Graph

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

  2. CodeForces 466E Information Graph --树形转线性+并查集

    题意:有三种操作: 1.新增一条边从y连向x,此前x没有父节点 2.x接到一份文件,(文件标号逐次递增),然后将这份文件一路上溯,让所有上溯的节点都接到这份文件 3.查询某个节点x是否接到过文件F 解 ...

  3. Codeforces 466 E. Information Graph

    并查集.... E. Information Graph time limit per test 1 second memory limit per test 512 megabytes input ...

  4. Broken line - SGU 124(判断点与多边形的关系)

    题目大意:RT 分析:构造一条射线,如果穿越偶数条边,那么就在多边形外面,如果穿越奇数条边,那么就在多边形里面. 代码如下: ===================================== ...

  5. C# GDI+ 利用 Rectangle GraphicsPath 判断 矩形或多边形 图形关系

    最近在做一些简单的图像对比工作,总结了一些GDI+对象的使用方式,记录下来共享给大家使用. 判断Rectangl与多边形的关系 /// <summary> /// 是否包含输入范围 /// ...

  6. .NET(C#):判断Type类的继承关系

    //Type类的函数 class Type bool IsInstanceOfType(object); //判断对象是否是指定类型 //类型可以是父类,接口 //用法:父类.IsInstanceOf ...

  7. 在ios开发中nil和NUll和Nilde区别————和如何判断连个对象的关系和UISlider不能拖动的问题

    nil表示一个对象指针为空,针对对象 >示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = nil; ...

  8. [置顶] 如何判断两个IP大小关系及是否在同一个网段中

    功能点  判断某个IP地址是否合法 判断两个IP地址是否在同一个网段中 判断两个IP地址的大小关系 知识准备 IP协议 子网掩码 Java 正则表达式 基本原理 IP地址范围 0.0.0.0- 255 ...

  9. POJ2318 TOYS(叉积判断点与直线的关系+二分)

    Calculate the number of toys that land in each bin of a partitioned toy box. Mom and dad have a prob ...

随机推荐

  1. UISearchBar和UISearchDisplayController

    原文 http://hi.baidu.com/happywilma0118/item/e6d5730a499bba1b3a53eef8 UISearchBar继承自UIView.UIResponder ...

  2. PyQt4颜色对话框QColorDialog

    QColorDialog提供了用于显示颜色的对话框. #!/usr/bin/python # -*- coding: utf-8 -*- import sys from PyQt4 import Qt ...

  3. Extjs6.2.0搭建项目框架

    1.安装 首先你总要去官网下载ext-6.2.0-gpl.zip和安装Sencha CMD工具来管理ExtJs项目,ext-6.2.0-gpl.zip下载完成解压先放在一边,一会用到. Sencha ...

  4. Date Json格式转换Date格式

    CreateTime=\/Date(1458722493663+0800)\/ var CreateTime="/Date(1458722493663+0800)/";var st ...

  5. java框架---->quartz整合spring(一)

    今天我们学习一下quartz的定时器的使用.年轻时我们放弃,以为那只是一段感情,后来才知道,那其实是一生. quartz的简单实例 测试的项目结构如下: 一.pom.xml中定义quartz的依赖 & ...

  6. Excel 2010 对号叉号怎么打出来

    按小键盘数字键:Alt+41420  对号 按小键盘数字键:Alt+41642  叉号 http://jingyan.baidu.com/article/fdbd4277c228cdb89e3f482 ...

  7. JavaWeb温习之Session对象

    1. Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服 ...

  8. UUID的定义以及作用

    UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software Foundation, OS ...

  9. Linux 使用 常识记忆

    1.当系统突然死机需要重启时,打开 命令输入端口,使用快捷键 Shift +Alt +F(1或6)打开 ,然后输入 shutdown -r now 如果提示shutdown need to be ro ...

  10. [Linux]ssh相关问题

    ssh链接不上的最可能原因是防火墙没关,一般提示“connection refused”. 可以使用这个命令查看:#service iptables status 暂时关闭iptables,重启后还会 ...