zoukankan      html  css  js  c++  java
  • bzoj4668 冷战

    冷战

    Time Limit: 10 Sec Memory Limit: 256 MB

    Description

    1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁
    幕演说”,正式拉开了冷战序幕。
    美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其
    盟国展开了数十年的斗争。在这段时期,虽然分歧和冲突严重,但双方都
    尽力避免世界范围的大规模战争(第三次世界大战)爆发,其对抗通常通
    过局部代理战争、科技和军备竞赛、太空竞争、外交竞争等“冷”方式进
    行,即“相互遏制,不动武力”,因此称之为“冷战”。
    Reddington 是美国的海军上将。由于战争局势十分紧张,因此他需要
    时刻关注着苏联的各个活动,避免使自己的国家陷入困境。苏联在全球拥
    有 N 个军工厂,但由于规划不当,一开始这些军工厂之间是不存在铁路
    的,为了使武器制造更快,苏联决定修建若干条道路使得某些军工厂联通。
    Reddington 得到了苏联的修建日程表,并且他需要时刻关注着某两个军工
    厂是否联通,以及最早在修建哪条道路时会联通。具体而言,现在总共有
    M 个操作,操作分为两类:
    • 0 u v,这次操作苏联会修建一条连接 u 号军工厂及 v 号军工厂的铁
    路,注意铁路都是双向的;
    • 1 u v, Reddington 需要知道 u 号军工厂及 v 号军工厂最早在加入第
    几条条铁路后会联通,假如到这次操作都没有联通,则输出 0;
    作为美国最强科学家, Reddington 需要你帮忙设计一个程序,能满足
    他的要求。

    Input

    第一行两个整数 N, M。
    接下来 M 行,每行为 0 u v 或 1 u v 的形式。
    数据是经过加密的,对于每次加边或询问,真正的 u, v 都等于读入的
    u, v 异或上上一次询问的答案。一开始这个值为 0。
    1 ≤ N, M ≤ 500000,解密后的 u, v 满足1 ≤ u, v ≤ N, u不等于v

    Output

    对于每次 1 操作,输出 u, v 最早在加入哪条边后会联通,若到这个操
    作时还没联通,则输出 0。

    Sample Input

    5 9

    0 1 4

    1 2 5

    0 2 4

    0 3 4

    1 3 1

    0 7 0

    0 6 1

    0 1 6

    1 2 6

    Sample Output

    0

    3

    5




    并查集不压缩暴力合并。。。
    我也不知道为什么我就是过不了。。。。
    生气了。。。。。
    心态崩了。。。。




    .。。。

    
    //好像过了QAQ
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 5e5 + 5;
    int n, m, tot, lastans;
    int mx, fa[maxn], tim[maxn], deep[maxn], len[maxn];
    
    int find(int t){
    	if(t == fa[t]){deep[t] = 1; return t;}
    	int ret = find(fa[t]);
    	deep[t] = deep[fa[t]] + 1; return ret;
    }
    
    inline void connect(int a, int b){
    	int A = find(a), B = find(b); tot++;
    	if(A == B) return;
    	if(len[A] > len[B]) swap(A, B);
    	fa[A] = B; tim[A] = tot;
    	len[B] = max(len[B], len[A] + 1);
    }
    
    inline int Query(int a, int b){
    	int A = find(a), B = find(b);
    	if(A != B) return 0;
    	if(deep[a] < deep[b]) swap(a, b);
    	int ret = 0;
    	while(deep[a] > deep[b]){ret = max(ret, tim[a]); a = fa[a];}
    	while(a != b){
    		ret = max(ret, tim[a]); ret = max(ret, tim[b]);
    		a = fa[a]; b = fa[b];
    	}
    	return ret;
    }
    
    int main()
    {
    	//freopen("lpl.in", "r", stdin);
    	scanf("%d%d", &n, &m);
    	for(int i = 1; i <= n; ++i){fa[i] = i; len[i] = 1;}
    	int opt, u, v;
    	while(m--){
    		scanf("%d%d%d", &opt, &u, &v);
    		u ^= lastans; v ^= lastans;
    		if(!opt) connect(u, v);
    		else{lastans = Query(u, v); printf("%d
    ", lastans);}
    	}
    	return 0;
    }
    
    
    心如花木,向阳而生。
  • 相关阅读:
    PHP 使用 GET 传递数组变量
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
  • 原文地址:https://www.cnblogs.com/LLppdd/p/9226325.html
Copyright © 2011-2022 走看看