BZOJ4668——冷战

1、题意:给一些点,有两种操作, 连通两个点和询问两个点最早是在什么时候连通

2、分析:这题用lct维护动态最小生成树就好。。但是过于暴力,我们可以倒着用并查集暴力查询,然后依旧是查询链上的最大值,然而这次我们不路径压缩,我们按秩合并,然后树高logn,接下来就随意弄啦

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 1000010

inline int read(){
    char ch = getchar(); int x = 0, f = 1;
    while(ch < ‘0‘ || ch > ‘9‘){
        if(ch == ‘-‘) f = -1;
        ch = getchar();
    }
    while(‘0‘ <= ch && ch <= ‘9‘){
        x = x * 10 + ch - ‘0‘;
        ch = getchar();
    }
    return x * f;
}

int fa[M], Rank[M], dep[M], val[M]; 

inline int find(int x){
    if(fa[x] == x) return x;
    int ret = find(fa[x]);
    dep[x] = dep[fa[x]] + 1;
    return ret;
}

inline int lca(int x, int y){
    int ans = 0;
    while(x != y){
        if(dep[x] < dep[y]) swap(x, y);
        ans = max(ans, val[x]);
        x = fa[x];
    }
    return ans;
}

int main(){
    //freopen("0input.in", "r", stdin);
    int n = read(), m = read();
    for(int i = 1; i <= n; i ++){
        fa[i] = i; Rank[i] = 1; dep[i] = 0;
    }
    int time = 0, ans = 0;
    for(int i = 1; i <= m; i ++){
        int op = read(), x = read(), y = read();
        x ^= ans; y ^= ans;
        if(!op){
            int px = find(x), py = find(y);
            time ++;
            if(px != py){
                if(Rank[px] >= Rank[py]){
                    fa[py] = px;
                    val[py] = time;
                    if(Rank[px] == Rank[py]) Rank[px] ++;
                }
                else{
                    fa[px] = py;
                    val[px] = time;
                }
            }
        }
        else{
            int px = find(x), py = find(y);
            if(px != py) ans = 0;
            else ans = lca(x, y);
            printf("%d\n", ans);
        }
    }
    return 0;
}
?
时间: 2024-11-05 14:39:01

BZOJ4668——冷战的相关文章

bzoj4668: 冷战 并查集

并查集,按秩合并,树高log,暴力查询. 果然bzoj新挂的题中过的人多的全是sb题. 写了一发秒WA,发现姿势不对.(@[email protected]) 然后过了50min,开始怀疑人生.(*_*) 这么长时间我lct都写完了.(Q_Q) 本着凡事要往好处想的精神,至少我改正了姿势.(T_T) #include<cstdio> #define N 500005 int n,m,q,k,s,t,l; int f[N],d[N],r[N],p[N]; int find(int i){ if(

【BZOJ-4668】冷战 并查集 + 启发式合并 + 乱搞

4668: 冷战 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 37  Solved: 24[Submit][Status][Discuss] Description 1946 年 3 月 5 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争.在这段时期,虽然分歧和冲突严重,但双方都尽力避免世界范围的大规模战争(第三次世界大战)爆发

美国人在学校里教育后代,是他们赢得了冷战的胜利,是真的吗?

From Quora, https://www.quora.com/Is-it-true-that-Americans-learn-in-school-that-they-won-the-Cold-War Question:美国人在学校里教育后代,是他们赢得了冷战的胜利,是真的吗? 我的朋友作为一名交换生刚从美国回来,她的历史老师在上课实说美国赢得了冷战.因为她在美国的一  个偏僻小镇上学(那里的人大多是个坚定的爱国者),所以我也不确定是这样吗?还是美国人就是这么教  的?我很想知道... An

从冷战到深度学习:一篇图文并茂的机器翻译史

从冷战到深度学习:一篇图文并茂的机器翻译史 选自Vas3k.com 作者:Ilya Pestov 英语版译者:Vasily Zubarev 中文版译者:Panda 实现高质量机器翻译的梦想已经存在了很多年,很多科学家都为这一梦想贡献了自己的时间和心力.从早期的基于规则的机器翻译到如今广泛应用的神经机器翻译,机器翻译的水平不断提升,已经能满足很多场景的基本应用需求了.近日,Ilya Pestov 用俄语写的机器翻译介绍文章经 Vasily Zubarev 翻译后发表到了 Vas3k.com 上.机

BZOJ 4668: 冷战

Description 在一个图上,在两个点间连一条边,问这两个点最早在什么时候联通. Sol 并查集+启发式合并. 按秩合并的并查集...我也不知道什么是按秩合并,反正就跟启发式合并差不多,合并的时候将小的往大的里和,因为每次增长都是小集合倍数的两倍以上,所以层数不超过 \(log n\) 然后连边的时候记录一下是第几次连接的,统计一下深度,最后暴力找LCA... Code /***********************************************************

bzoj4668

并查集+最小生成树 首先我们发现这题可以lct维护最小生成树,但是发现如果生成树在之后是不会修改的,那么就想到了并查集,然后就不知道怎么做了... 其实当我们连接两个连通块的时候,两个连通块只能通过这一条边联通,所以这条边的两个端点是谁并不重要,因为两个连通块之间的通道最小值不会受到位置的影响.那么我们就可以利用并查集进行按秩合并,使树高只有logn,然后每次查询就是暴力lca查找路径最值 #include<bits/stdc++.h> using namespace std; int n,

沟通很重要

省赛结束了,但真正的工作才刚刚开始,省赛只是国赛的前期热身.学校已经放假了,而我并没有放假,我还在指导着即将参加国赛的同学们学习,一直到小年夜才能回家.谁说教师最幸福的就是有寒暑假,看着别的教师放寒暑假而自己不能休假,其实一点也不幸福. 省赛指导的那名需要我相信他的同学,今天和苏老师说他不想参加比赛了,着急找工作了,心思也不在这,状态也不好,学不进去了.我也知道他最近的状态,其实与其在这浪费时间,倒真不如去干点什么,可能省赛他就已经有这样的想法了,但碍于他曾经许下的承诺,一直也没说.苏老师这次跟

特朗普的中国命题作文,很可能以贸易战开头文图/陆飞

文图/陆飞 大选的结果让很多人意外,嘴硬的特朗普笑到了最后:希拉里也挺有风度,主动给特朗普打电话,这算是认输了. 对于选举结果的分析:为什么希拉里得势不得分,为什么特朗普成功上位,本文不再赘述.一直看热闹的我们,现在可以关心下一个话题,特朗普将怎么书写摆在他面前的其中一篇命题作文:中国. 1.复盘,反全球化和孤立主义帮了特朗普 有必要简单复盘特朗普获胜的关键,看一张图(蓝色-民主党·希拉里,红色-共和党·特朗普):   发文时,根据微软必应大数据,大选前全美共有18个"摇摆州"--其中

苏黄永郦的第五周读书报告

世界是数字的 通信的力量 世界上最具有重要意义的长距离通信是公元不知多少年前的马拉松战役,雅典军队打赢了战役,派了一位善于长跑的士兵费迪皮迪兹从马拉松把捷报传到42公里之外的雅典.这位士兵用尽全力跑回雅典,说了“庆祝吧,我们胜利了!”之后就倒地不醒了.还好,现在通信的速度不是当年的马拉松速度了.目前,信息以光速传播,世界各地的人们可以很快的就知道那些发生在世界各地的新闻. 电话网是人类最早使用的通讯网络.电话是人用来传输语音信息的,即使再提速,也不可能像电脑那么快,这是电话本身的技术局限性.当互