题意:

  初始有n个点,m次操作。每次操作加一条边或者询问两个点第一次连通的时刻(若不连通输出-1)。

题解:

  用并查集维护每个点所在连通块的根。对于每次加边,暴力的更新新的根。

  每次将2个块合并时,将小的块并向大的块。这么合并使得每个点的根最多更新log2n次,并储存每次更新信息(更新时刻以及新的根)。

  对于每一次询问,二分两个点第一次连通的时刻。对于每一个二分的时刻,求的是两点的根是否相同。

  由于存储过了每个点根的更新信息,所以再用二分求出他这个时刻的根。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+;
int t;
int n, m;
int u, v, k;
int f[N], num[N];
vector<pair<int, int> > g[N];
vector<int> c[N];
bool check(int x) {
int l = , r = g[u].size()-;
while(l <= r) {
int mid = l+r>>;
if(g[u][mid].first <= x) l = mid+;
else r = mid-;
}
int p1 = g[u][r].second;
l = , r = g[v].size()-;
while(l <= r) {
int mid = l+r>>;
if(g[v][mid].first <= x) l = mid+;
else r = mid-;
}
int p2 = g[v][r].second;
if(p1==p2) return ;
return ;
}
int main() {
scanf("%d", &t);
while(t--) {
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) {
num[i] = ;
f[i] = i;
c[i].clear();
g[i].clear();
c[i].push_back(i);
g[i].push_back(make_pair(, i));
}
for(int i = ; i <= m; i++) {
scanf("%d%d%d", &k, &u, &v);
if(k&) {
u = f[u]; v = f[v];
if(u!=v) {
if(num[u]>num[v]) swap(u, v);
for(int j = ; j < num[u]; j++) {
c[v].push_back(c[u][j]);
f[c[u][j]] = v;
g[c[u][j]].push_back(make_pair(i, v));
}
num[v] += num[u];
num[u] = ;
c[u].clear();
}
}
else {
int l = , r = i-;
while(l<=r) {
int mid = l+r>>;
if(check(mid)) r = mid-;
else l = mid+;
}
if(check(r+)) printf("%d\n", r+);
else puts("-1");
}
}
}
}

GYM - 100814 C.Connecting Graph的更多相关文章

  1. Gym 100814C Connecting Graph 并查集+LCA

    Description standard input/output Statements Alex is known to be very clever, but Walter does not be ...

  2. Codeforces Gym 100814C Connecting Graph 树剖并查集/LCA并查集

    初始的时候有一个只有n个点的图(n <= 1e5), 现在进行m( m <= 1e5 )次操作 每次操作要么添加一条无向边, 要么询问之前结点u和v最早在哪一次操作的时候连通了 /* * ...

  3. codeforces gym/100814 humming distance (二进制位数比较)

    Gym - 100814I I. Salem time limit per test 1 second memory limit per test 1024 megabytes input stand ...

  4. Connecting Graph

    Given n nodes in a graph labeled from 1 to n. There is no edges in the graph at beginning. You need ...

  5. Solution -「Gym 102759F」Interval Graph

    \(\mathcal{Description}\)   Link.   给定 \(n\) 个区间,第 \(i\) 个为 \([l_i,r_i]\),有权值 \(w_i\).设一无向图 \(G=(V=\ ...

  6. codeforces Gym 100814 A、B、F、I

    A题 先求出来这个数是第几大  阶乘求概率p  然后计算获得胜率的概率 常规解法把所有情况考虑一遍(跳1次,2次,3次……)要用到组合数  数可能太大了会爆的行不通 我们观察发现它有递推性质,从第二大 ...

  7. Egyptian Collegiate Programming Contest (ECPC 2015) C题 Connecting Graph

    这题上次用的是线性求LCA过的,数据比较水,当时没有被T掉(不过线性的做法是在线的).现在重新的分析一下这个问题.在所有的操作都进行完毕以后,这个图形肯定会变成一棵树,而我们的要求是在这棵树上的一条链 ...

  8. ACM International Collegiate Programming Contest, Egyptian Collegiate Programming Contest (ECPC 2015)

    A.Arcade Game(康拓展开) 题意: 给出一个每个数位都不同的数n,进行一场游戏.每次游戏将n个数的每个数位重组.如果重组后的数比原来的数大则继续游戏,否则算输.如果重组后的数是最大的数则算 ...

  9. Union Find - 20181102 - 20181105

    Union Find: 589. Connecting Graph public class ConnectingGraph { //父节点数组 private int[] father = null ...

随机推荐

  1. vue服务端渲染按需引入mint

    vue服务器渲染按需引入mint-ui 1.修改.babelrc文件,在.babelrc文件中plugins数组中添加 { "presets": [["es2015&qu ...

  2. PHP计算两个时间戳之间间隔时分秒

    /功能:计算两个时间戳之间相差的日时分秒//$begin_time 开始时间戳//$end_time 结束时间戳function timediff($begin_time,$end_time){ if ...

  3. 网站如何防止sql注入攻击的解决办法

    首先我们来了解下什么是SQL注入,SQL注入简单来讲就是将一些非法参数插入到网站数据库中去,执行一些sql命令,比如查询数据库的账号密码,数据库的版本,数据库服务器的IP等等的一些操作,sql注入是目 ...

  4. 函数:引用file类对象及io类对象作为参数打印文本及显示文本

    #include <iostream> #include <fstream> #include <cstdlib> using namespace std; voi ...

  5. 006---Python基本数据类型--集合

    集合 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px ...

  6. Hbase数据IO

    场景及方案分析 场景1:logs --> HBase logs -> flume -> hfile -> import -> HBase (实时) csv导入HBase ...

  7. .NET中调用不安全代码

           .NET中是不允许不安全的代码的,比如指针等.但有些特殊场合还是需要用到指针,这时候就需要在你的代码块上加上unsafe标签.如: 1: unsafe static void Main( ...

  8. 25、react入门教程

    0. React介绍 0.1 什么是React? React(有时称为React.js 或ReactJS)是一个为数据提供渲染HTML视图的开源JavaScript库. 它由FaceBook.Inst ...

  9. iOS-Debug Symbol(调试符号)

    Debug Symbol(调试符号) 编译警告 从svn下载下来的文件,到处都是编译警告,看着不爽,找下原因,没想到还是一条大鱼 warning: (i386) /UsersLibrary/Devel ...

  10. OpenCV入门:(五:更改图片对比度和亮度)

    1. 理论 图片的转换就是将图片中的每个像素点经过一定的变换,得到新像素点,新像素点组合成一张新的图片. 改变图片对比度和亮度的变换如下: 其中α和β被称作增益参数(gain parameter)和偏 ...