首先对于一个连通块中,询问我们可以直接用平衡树来求出排名,那么我们可以用并查集来维护各个块中的连通情况,对于合并两个平衡树,我们可以暴力的将size小的平衡树中的所有节点删掉,然后加入大的平衡树中,因为每个点只可能被删除插入logn次,所以时间复杂度为nlog^2n。

  

/**************************************************************
    Problem: 2733
    User: BLADEVIL
    Language: C++
    Result: Accepted
    Time:2112 ms
    Memory:64868 kb
****************************************************************/
 
//By BLADEVIL
#include <cstdio>
#define maxn 100010
#define maxt 4000010
 
using namespace std;
 
int n,m;
int father[maxn],a[maxn],root[maxn];
int left[maxt],right[maxt],size[maxt],key[maxt];
int tot,save;
int adr[maxn];
 
int getfather(int x)
{
    if (father[x]==x) return x;
    return father[x]=getfather(father[x]);
}
 
void swap(int &x,int &y)
{
    int z=x;
    x=y; y=z;
}
 
void left_rotate(int &t)
{
    int k=right[t];
    right[t]=left[k];
    left[k]=t;
    size[k]=size[t];
    size[t]=size[left[t]]+size[right[t]]+;
    t=k;
}
 
void right_rotate(int &t)
{
    int k=left[t];
    left[t]=right[k];
    right[k]=t;
    size[k]=size[t];
    size[t]=size[left[t]]+size[right[t]]+;
    t=k;
}
 
void maintain(int &t,bool flag)
{
    if (!flag)
    {
        if (size[left[left[t]]]>size[right[t]])
            right_rotate(t); else
        if (size[right[left[t]]]>size[right[t]])
            left_rotate(left[t]),right_rotate(t); else return;
    } else
    {
        if (size[right[right[t]]]>size[left[t]])
            left_rotate(t); else
        if (size[left[right[t]]]>size[left[t]])
            right_rotate(right[t]),left_rotate(t); else return;
    }
    maintain(left[t],); maintain(right[t],);
    maintain(t,); maintain(t,);
}
 
void t_insert(int &t,int v)
{
    if (!t)
    {
        t=++tot;
        left[t]=right[t]=;
        key[t]=v;
        size[t]=;
    } else
    {
        size[t]++;
        if (v>key[t]) t_insert(right[t],v); else t_insert(left[t],v);
        maintain(t,v>key[t]);
    }
}
 
int t_delete(int &t,int v)
{
    size[t]--;
    if ((key[t]==v)||((v>key[t])&&(!right[t]))||((v<key[t])&&(!left[t])))
    {  
        save=key[t];
        if ((!left[t])||(!right[t]))
            t=left[t]+right[t]; else key[t]=t_delete(left[t],v+);
     
    } else
        return (v>key[t])?t_delete(right[t],v):t_delete(left[t],v);
}
 
int t_rank(int &t,int k)
{
    if (size[left[t]]+==k) return key[t];
    return (k<=size[left[t]])?t_rank(left[t],k):t_rank(right[t],k-size[left[t]]-);
}
 
void combine(int x,int y)
{
    int fx,fy;
    fx=getfather(x); fy=getfather(y);
    if (size[root[fx]]<size[root[fy]]) swap(fx,fy);
    father[fy]=fx;
    if (fx!=fy)
    {
        fy=root[fy];
        while (root[fy])
        {
            t_insert(root[fx],a[fy]);
            t_delete(root[fy],a[fy]);
        }
    }
}
 
void ask(int x,int k)
{
    x=root[getfather(x)];
    if (size[x]>=k) printf("%d\n",adr[t_rank(x,k)]); else printf("-1\n");
}
 
void init()
{
    int x,y;
    scanf("%d%d",&n,&m);
    for (int i=;i<=n;i++) scanf("%d",&a[i]);
    for (int i=;i<=n;i++) adr[a[i]]=i;
    for (int i=;i<=n;i++) father[i]=i,t_insert(root[i],a[i]);
    while (m--)
    {
        scanf("%d%d",&x,&y);
        combine(x,y);
    }
}
 
void solve()
{
    int test,x,y;
    char s[];
    scanf("%d",&test);
    while (test--)
    {
        scanf("%s%d%d",&s,&x,&y);
        if (s[]=='B')
            combine(x,y); else ask(x,y);
    }
}
 
int main()
{
    init();
    solve();
    return ;
}

bzoj 2733 平衡树启发式合并的更多相关文章

  1. bzoj 2733 Splay 启发式合并,名次树

    题意:给定一个带点权的无向图,有两种操作: 1.将两个连通分量合并. 2.查询某个连通分量里的第K大点. 题解: 用并查集维护连通关系,一开始建立n棵splay树,然后不断合并,查询. 处理技巧: 1 ...

  2. BZOJ 2809: [Apio2012]dispatching( 平衡树 + 启发式合并 )

    枚举树上的每个结点做管理者, 贪心地取其子树中薪水较低的, 算出这个结点为管理者的满意度, 更新答案. 用平衡树+启发式合并, 时间复杂度为O(N log²N) ------------------- ...

  3. ☆ [HNOI2012] 永无乡 「平衡树启发式合并」

    题目类型:平衡树启发式合并 传送门:>Here< 题意:节点可以连边(不能断边),询问任意两个节点的连通性与一个连通块中排名第\(k\)的节点 解题思路 如果不需要询问排名,那么并查集即可 ...

  4. bzoj 2809 左偏树\平衡树启发式合并

    首先我们对于一颗树,要选取最多的节点使得代价和不超过m,那么我们可以对于每一个节点维护一个平衡树,平衡树维护代价以及代价的和,那么我们可以在logn的时间内求出这个子树最多选取的节点数,然后对于一个节 ...

  5. BZOJ 2733 & splay的合并

    题意: 带权联通块,添边与查询联通块中第k大. SOL: splay合并+并查集. 我以为splay可以用奇技淫巧来简单合并...调了一下午终于幡然醒悟...于是就只好一个一个慢慢插...什么启发式合 ...

  6. 【pb_ds】【平衡树启发式合并】【并查集】bzoj2733 [HNOI2012]永无乡

    用并查集维护联通性.对每个联通块维护一个平衡树.合并时启发式合并.比较懒,用了pb_ds. #include<cstdio> #include<ext/pb_ds/assoc_con ...

  7. 【BZOJ1483】[HNOI2009]梦幻布丁(平衡树启发式合并+并查集)

    题目: BZOJ1483 分析: (这题码了一下午,码了近250行,但是意外跑的比本校各位神仙稍快,特写博客纪念) 首先能看出一个显然的结论:颜色段数只会变少不会变多. 我们考虑用并查集维护区间,对于 ...

  8. bzoj 1483 链表 + 启发式合并

    思路:将颜色相同的建成一个链表, 变颜色的时候进行链表的启发式合并.. 因为需要将小的接到大的上边,所以要用个f数组. #include<bits/stdc++.h> #define LL ...

  9. bzoj 1483 链表启发式合并

    首先我们可以比较容易的在n的时间内算出来开始的答案,我们维护一些链表,分别表示不同的颜色,那么我们在计算答案的时候,只需要扫一遍所有的链表,判断链表相邻两项是否在序列中相邻,不相邻的话肯定在这其中的一 ...

随机推荐

  1. 数据库集群之路二 MYCAT

    windows下安装配置并使用mycat 参考:http://www.cnblogs.com/parryyang/p/5758087.html 一 下载windows版本 https://github ...

  2. Java-编译后出现$1.class、$2.class等多个class文件

    部署代码的时候,由于自身技术不精和疏忽,导致查询数据没有正常显示, 排除法最后只能是放置部署文件时未包括多出来的$class文件.放上去之后果然好使了,才记录下这个问题... 这是因为在我们写的类中存 ...

  3. Jedis源码解析——Jedis和BinaryJedis

    1.基本信息 先来看看他们的类定义: public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands ...

  4. idea快捷键操作

    在编写代码的时候直接输入psv就会看到一个psvm的提示,此时点击tab键一个main方法就写好了. psvm 也就是public static void main的首字母. 依次还有在方法体内键入f ...

  5. CSS设计指南之一 HTML标记与文档结构

    HTML标记与文档结构 之所以从HTML讲起,是因为CSS的用途就是为HTML标记添加样式. 1.1 HTML标记基础 对于每个包含内容的元素,根据它所包含的内容是不是文本,有两种不同的方式给它们加标 ...

  6. Java、JSP与JavaScript的区别

    java和javaScript是两种完全不同的语言,并不是收都有个java就类似 Java,全称应该是 Java Applet,是嵌在网页中,而又有自己独立的运行窗口的小程序.Java Applet ...

  7. 【Python】python-内置常量

    引言 Python的内置常量不多,只有6个,分别是True.False.None.NotImplemented.Ellipsis.__debug__ 一.True 1.True是bool类型用来表示的 ...

  8. Spline样条函数 //C++关键字:operator // 重载函数 // 隐含的this指针 // 指针和const限定符

    在数学学科数值分析中,样条是一种特殊的函数,由多项式分段定义.样条插值是使用一种名为样条的特殊分段多项式进行插值的形式.由于样条插值可以使用低阶多项式样条实现较小的差值误差,这样就避免了使用高阶多项式 ...

  9. 【bzoj2091】[Poi2010]The Minima Game dp

    题目描述 给出N个正整数,AB两个人轮流取数,A先取.每次可以取任意多个数,直到N个数都被取走.每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下 ...

  10. 整合常用功能的JS小组件库-v1.0

    function Alex() { //给予video.js的页面滚动到视频元素范围内自动播放/出范围暂停播放-----01 this.video_autoplay = function (box) ...