首页 > 其他分享 >洛谷P1196 [NOI2002] 银河英雄传说

洛谷P1196 [NOI2002] 银河英雄传说

时间:2022-12-24 10:56:53浏览次数:69  
标签:洛谷 fa int fy 查集 bef fx NOI2002 P1196

slojP2577. 食物链

题目大意

一个序列初始编号为 1,2,3,,,30000

有 2 个操作:

m i j 合并第 i 列和第 j 列,将第 i 列头部接到第 j 列尾部

c I j 询问 i 号和 j 号之间的数量,若不在同一列则输出-1

第一行有一个整数T(1≤T≤5×105),表示总共有T条指令。

 

先分析一波

这个数据规模来看,必定是nlogn的复杂度

也就是说每个操作都是logn级别的才行

好像说了堆废话

这时,再结合题面中所给的合并操作,不难想到并查集

但是,明显普通并查集不好解决这个问题

那就用带权并查集啊

合并操作并不难,不是本题代码的关键,不过是思路中的关键

我们先考虑查询:本题难点是要查询 i,j 之间的数量而不是哪些数,

i 列和 j 列合并时,如果知道 i,j 列的数量,

则合并后,j 列中的数不受影响,i 列的每个数前面的数的个 数增加 j 列的总数。

我们需要知道每列的信息,用并查集来维护每列,

并查集每个集合维护两个值:集合总 数 count、集合中元素前面有多少元素 bef。

显然,开始时,count[i] = 1,bef[i] = 0

到此为止,基本上已经可以构建出一个框架了

最主要的函数则是并查集的find_()和merge()操作,

后者因为题目里的一些原因,被我写在了主函数里,可自行寻找

#include<bits/stdc++.h>
using namespace std;
int t,fa[30010],cnt[30010],bef[30010];
int find_(int x){
    if(fa[x]==x)return x;
    int fx = find_(fa[x]);
    bef[x]+=bef[fa[x]];
    return fa[x] = fx;
}
int main(){
    scanf("%d",&t);
    for(int i = 1;i<=30000;i++){
        fa[i] = i;
        cnt[i] = 1;
    }
    for(int i = 1;i<=t;i++){
        int x,y;char ch;
        cin>>ch;
        scanf("%d%d",&x,&y);
        int fx = find_(x);
        int fy = find_(y);
        if(ch=='M'){    
            fa[fx] = fy;
            bef[fx] = bef[fy]+cnt[fy];
            cnt[fy]+=cnt[fx];
        }else{
            if(fx!=fy) puts("-1");
            else printf("%d\n",abs(bef[x]-bef[y])-1);
        }
    }
    return 0;
}

非常的简短噢

标签:洛谷,fa,int,fy,查集,bef,fx,NOI2002,P1196
From: https://www.cnblogs.com/cztq/p/17002475.html

相关文章

  • Solution -「COCI 2009-2010」「洛谷 P8076」RESTORAN
    \(\mathscr{Description}\)  Link.  给定一个含\(n\)个点\(m\)条边的简单图,求一种边二染色方案,使得所有\(\deg\ge2\)的结点都邻接于两种颜色的边.  \(n......
  • AcWing341. 洛谷P1073, NOIP2009 最优贸易
    AcWing题目传送门洛谷题目传送门题目大意\(~~~~~~\)一个投机倒把的奸商想要通过城市不太健全的贸易系统坑点钱,任意城市都可以买入或者卖出水晶球,他想尽量在便宜的城市买......
  • 洛谷 P2679 [NOIP2015 提高组]子串
    \(70pts\):记\(sub_A(i)\)表示\(A\)的前\(i\)个字符构成的子串,相应地,\(sub_B(i)\)为\(B\)的前\(i\)个字符构成的子串。设\(f(i,j,k)\)表示在\(sub_A(i......
  • 洛谷P2680 运输计划(LCA + 二分 + 树上边差分)
    洛谷P2680运输计划​ 现在有一棵树,每条树边上都有正权值。接下来,有m个询问,每次询问给出两个结点,这两个结点之间有一条路径。现在你可以任选一条树边,将其边权置为0,请输......
  • 洛谷 P5401 [CTS 2019] 珍珠 题解
    题目链接令\(c_i\)表示第i种颜色的珍珠的数量,显然我们最多能装的瓶数是\(\sum\lfloor\frac{c_i}2\rfloor\)。也就是说,\(c_i\)为奇数的\(i\)的数量不能太多,这个数量要......
  • 洛谷 P6580 [Ynoi 2019] 美好的每一天~ 不连续的存在 题解
    既然是YNOI那肯定是要分块的。先考虑树是一条链的情况,可以直接回滚莫队,对n个节点组成的序列分块。在回滚莫队的过程中,当前维护的区间一共会扩展\(O(n\sqrtn)\)次,每次都是......
  • 洛谷 P1712 [NOI2016] 区间
    很多套路糅合在一起的一道题。记\(len_i=r_i-l_i\)。则所求转化为一个有\(m\)个区间的集合\(S\),满足:存在一个\(x\),使得对于所有\(S\)中的区间\(i\),有\(l_......
  • 洛谷P3224 [HNOI2012]永无乡 题解 splay tree 启发式合并
    题目链接:https://www.luogu.com.cn/problem/P3224主要知识点是:树上启发式合并,即每次合并将小的树里面的每个点合并大大的树里面,时间复杂度\(O(n\log^2n)\)。同时需要......
  • 洛谷-P1450 硬币购物
    P1450硬币购物容斥||\(dp\)+单调队列优化容易看出是个多重背包,然后拿单调队列优化一下后,计算量为\(O(4ns)\)这种做法的话就是单调队列优化板子题#include<bits/......
  • 洛谷 P1020 导弹拦截(递增子串 DP )
    题目大意:有一个数列,我们要获取一组子串,这个子串必须单调不增。问:(1)最长我们可以获取多长的这种子串(2)这个数列中最多有多少种这种子串解题思路:其中问题一是很典型的DP问题,最......