`

poj 2985 并查集+树状数组求第k大数

    博客分类:
  • acm
阅读更多
#include <stdio.h>
#include <string.h>
#define lowbit(i) i&(-i)
#define maxn 300000
using namespace std;
int a[maxn],c[maxn],p[maxn];
int fd(int x)
{
    return x==p[x] ? x :fd(p[x]);
}
void update(int x,int val)
{
    while(x<=maxn)
    {
        c[x]+=val;
        x+=lowbit(x);
    }
}
int find_kth(int k)
{
    int ans = 0,cur = 0;
    for(int i=20;i>=0;i--)
    {
        ans+=(1<<i);
        if(ans>maxn||cur+c[ans]>=k)
            ans-=(1<<i);
        else
            cur+=c[ans];
    }
    return ans+1;
}
int main()
{
    int n,m,k,l,t,q,x,y;
    scanf("%d %d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        p[i]=i;
        a[i]=1;
    }
    update(1,n);
    int num = n;
    while(m--)
    {
        scanf("%d",&q);
        if(q==0)
        {
            scanf("%d %d",&x,&y);
            x = fd(x);
            y = fd(y);
            if(x==y) continue;
            update(a[x],-1);
            update(a[y],-1);
            update(a[x]+a[y],1);
            p[y]=x;
            a[x]+=a[y];
            num--;
        }
        else
        {
            scanf("%d",&k);
            printf("%d\n",find_kth(num-k+1));
        }
    }
    return 0;
}
分享到:
评论

相关推荐

    图的深搜+树状数组练习 POJ 3321(JAVA)

    标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...

    树状数组练习:POJ 2481(JAVA)

    【标题】"树状数组练习:POJ 2481(JAVA)" 是一篇关于使用树状数组(也称为线段树)解决编程竞赛问题的文章。这篇文章可能详细讲解了如何运用这种数据结构来解决特定的问题POJ 2481。POJ(Programming Online Judge)...

    树状数组练习:POJ 3067

    【标题】"树状数组练习:POJ 3067" 树状数组,也称为线段树(Segment Tree),是一种高效的数据结构,用于处理区间查询和修改问题。在这个问题中,我们通过分析POJ 3067的题目来探讨如何应用树状数组解决实际问题。...

    poj2492并查集应用的扩展

    poj2492 A Bug's Life并查集应用的扩展,希望可以给大家带来用处

    poj 2352 stars(树状数组,线段树)

    ### POJ 2352 Stars - 树状数组与线段树实现 #### 题目背景 POJ 2352 Stars 是一道经典的算法题目,它提供了使用树状数组或线段树来解决的可能性。这两种数据结构都是为了高效处理区间查询问题而设计的。在这篇...

    POJ 1988 简单并查集,

    根据给定的信息,本文将详细解释“POJ 1988 简单并查集”中的核心知识点,包括并查集的基本概念、代码实现以及在本题中的具体应用。 ### 并查集基本概念 并查集是一种用于处理一些不交集的合并及查询问题的数据...

    二维树状数组学习之二:练习POJ 1195

    在本篇中,我们将深入学习二维树状数组的应用,并通过解决POJ 1195问题来实践这一概念。 POJ 1195题目要求我们计算一个二维矩阵中的子矩阵之和。这正是二维树状数组的优势所在,因为我们可以快速地对矩阵的任意矩形...

    二维树状数组练习 POJ 2029

    它扩展了一维树状数组(也称作线段树),能够处理二维或多维的数组更新和查询操作。在POJ 2029这个题目中,我们可能面临的问题是需要对一个二维矩阵进行动态更新和求和查询,例如计算某一个矩形区域内的元素总和。 ...

    树状数组题解1

    树状数组,又称线段树(Segment Tree),是一种用于高效解决区间查询与修改问题的数据结构。在上述题目中,树状数组被广泛应用于各种不同的场景,如星星坐标的等级计算、矩阵操作、序列排序优化以及线路交叉点的计算...

    西北工业大学POJ试题C++答案代码+课程设计

    "西北工业大学POJ试题C++答案代码+课程设计"这一标题表明了资源的主要内容,涉及两个核心部分:一是西北工业大学的编程竞赛(POJ,Problem Oriented Judge System)的C++解题代码,二是与这些题目相关的课程设计。...

    POJ1207-The 3n + 1 problem

    《POJ1207-The 3n + 1 problem》是北京大学在线编程平台POJ上的一道经典算法题目,其主要涉及的知识点是数论和动态规划。本题目的核心是解决著名的“Collatz Conjecture”问题,也被称为“3n+1猜想”。 3n+1猜想是...

    ACMer需要掌握的算法讲解 (2).docx

    * 最小树形图:POJ3164 * 次小生成树 * 无向图、有向图的最小环 三、数据结构 * RMQ:POJ3264、POJ3368 * 并查集的高级应用:POJ1703、POJ2492 * KMP算法:POJ1961、POJ2406 * 左偏树(可合并堆) 四、搜索 * 最...

    POJ2092:计数排序,求第K大的元素

    【标题】"POJ2092:计数排序,求第K大的元素"是一个编程题目,主要涉及计数排序算法以及如何在数组中找出第K大的元素。计数排序是一种非基于比较的排序算法,它适用于整数排序,尤其在数据范围不大的情况下效率极高。...

    树状数组(Binary Indexed Tree)

    **树状数组**(Binary Indexed Tree, BIT),又称**费尼克树**(Fenwick Tree),是一种特殊的数据结构,它能高效地完成对数组元素的累加查询和更新操作。相较于其他数据结构如线段树,树状数组在实现上更为简洁,...

    数据结构--并查集(Union-Find Sets)

    1. **树形结构**:并查集通常用一棵树来表示各个集合,其中每个节点代表一个元素,根节点代表集合的代表元素。通过调整树的结构,可以优化查找和连接操作。 2. **路径压缩**:为了提高查找效率,我们可以对查找路径...

    D_(POJ_1723)(思维)(第k大数).cpp

    D_(POJ_1723)(思维)(第k大数).cpp

    ACM数据结构之树状数组和线段树

    ### ACM数据结构之树状数组和线段树 #### 线段树 线段树是一种非常有效的数据结构,主要用于解决区间查询问题。它能够快速地处理区间内的各种操作,如查询、修改等。 ##### 线段树的定义与特性 线段树本质上是一...

    POJ PKU 必做题+部分难题1001-2500

    1011,1012,1013,1014,1015,1017,1026,1028,1032,1035,1041,1046,1129 1149 1154 1165 1182 1185 1190 1191 1201 1251 1273 1275 1276 1286 1322 1338 1363 1364 1401 1456 1459 1564 1579 1637 1657 1658 ...

Global site tag (gtag.js) - Google Analytics