bzoj4668

并查集+最小生成树

首先我们发现这题可以lct维护最小生成树,但是发现如果生成树在之后是不会修改的,那么就想到了并查集,然后就不知道怎么做了。。。

其实当我们连接两个连通块的时候,两个连通块只能通过这一条边联通,所以这条边的两个端点是谁并不重要,因为两个连通块之间的通道最小值不会受到位置的影响。那么我们就可以利用并查集进行按秩合并,使树高只有logn,然后每次查询就是暴力lca查找路径最值

#include<bits/stdc++.h>
using namespace std;
int n, m, ans;
int fa[500010], d[500010];
int find(int x)
{
    if(x == fa[x]) return x;
    int a = find(fa[x]);
    d[a] = min(d[a], d[x]);
    return fa[x] = a;
}
void connect(int u, int v)
{
    int a = find(u), b = find(v);
    if(a == b) return;
    d[a] = min(d[a], d[b]);
    fa[b] = a;
}
int main()
{
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; ++i) fa[i] = i;
    for(int i = 1; i <= m; ++i)
    {
        int opt, u, v;
        scanf("%d%d%d", &opt, &u, &v);
        u ^= ans;
        v ^= ans;
        if(opt == 0) connect(u, v);
        if(opt == 1)
        {
            int a = find(u), b = find(v);
            if(a != b)
            {
                ans = 0;
                puts("0");
            }
            else printf("%d\n", ans = d[a]);
        }
    }
    return 0;
}

时间: 2024-12-27 09:42:26

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 日,英国前首相温斯顿·丘吉尔在美国富尔顿发表“铁幕演说”,正式拉开了冷战序幕. 美国和苏联同为世界上的“超级大国”,为了争夺世界霸权,两国及其盟国展开了数十年的斗争.在这段时期,虽然分歧和冲突严重,但双方都尽力避免世界范围的大规模战争(第三次世界大战)爆发

BZOJ4668——冷战

1.题意:给一些点,有两种操作, 连通两个点和询问两个点最早是在什么时候连通 2.分析:这题用lct维护动态最小生成树就好..但是过于暴力,我们可以倒着用并查集暴力查询,然后依旧是查询链上的最大值,然而这次我们不路径压缩,我们按秩合并,然后树高logn,接下来就随意弄啦 #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace st