启发式合并?!

似乎当时写并查集的时候就有看到过类似于把小并查集并到大并查集上的说法,原来这就是启发式……

具体做法就是把小树里面的一个个拿出来,然后加到大树里面去(裸的不敢相信)

const

  maxn=;

  number=;

var

  left,right,size,value,hash,key,fa,num,root:array[..maxn]of longint;

  tot:longint;

procedure swap(var x,y:longint);

var

  i:longint;

begin

  i:=x;

  x:=y;

  y:=i;

end;

procedure lt(var x:longint);

var

  k:longint;

begin

  k:=right[x];

  right[x]:=left[k];

  left[k]:=x;

  size[k]:=size[x];

  size[x]:=size[left[x]]+size[right[x]]+;

  x:=k;

end;

procedure rt(var x:longint);

var

  k:longint;

begin

  k:=left[x];

  left[x]:=right[k];

  right[k]:=x;

  size[k]:=size[x];

  size[x]:=size[left[x]]+size[right[x]]+;

  x:=k;

end;

procedure insert(var x:longint;y:longint);

begin

  if x= then begin

    inc(tot);

    x:=tot;

    value[x]:=num[y];

    hash[x]:=y;

    key[x]:=random(number);

    left[x]:=;

    right[x]:=;

    size[x]:=;

    exit;

  end;

  inc(size[x]);

  if value[x]<num[y] then begin

    insert(right[x],y);

    if key[right[x]]<key[x] then lt(x);

  end

  else begin

    insert(left[x],y);

    if key[left[x]]<key[x] then rt(x);

  end;

end;

procedure dfs(var x:longint;y:longint);

begin

  if y= then exit;

  insert(x,hash[y]);

  dfs(x,left[y]);

  dfs(x,right[y]);

end;

function getfa(x:longint):longint;

begin

  if fa[x]=x then exit(x);

  fa[x]:=getfa(fa[x]);

  exit(fa[x]);

end;

procedure link(x,y:longint);

begin

  x:=getfa(x);

  y:=getfa(y);

  if x=y then exit;

  if size[root[x]]<size[root[y]] then swap(x,y);

  dfs(root[x],root[y]);

  fa[y]:=x;

end;

function find(x,y:longint):longint;

begin

  if x= then exit(-);

  if size[left[x]]=y- then exit(hash[x]);

  if size[left[x]]>y- then exit(find(left[x],y))

    else exit(find(right[x],y-size[left[x]]-));

end;

procedure into;

var

  i,x,y,n,m:longint;

begin

  readln(n,m);

  randomize;

  for i:= to n do begin

    read(num[i]);

    fa[i]:=i;

    insert(root[i],i);

  end;

  for i:= to m do begin

    readln(x,y);

    link(x,y);

  end;

end;

procedure work;

var

  n,x,y,i:longint;

  ch:char;

begin

  readln(n);

  for i:= to n do begin

    readln(ch,x,y);

    case ch of

      'B':link(x,y);

      'Q':writeln(find(root[getfa(x)],y));

    end;

  end;

end;

begin

  into;

  work;

end.

【以前的空间】BZOJ2733[HNOI2012]永无乡的更多相关文章

  1. bzoj2733: [HNOI2012]永无乡 启发式合并

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=2733 题目: 2733: [HNOI2012]永无乡 Time Limit: 10 Sec   ...

  2. bzoj2733: [HNOI2012]永无乡(splay)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3778  Solved: 2020 Description 永 ...

  3. [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4108  Solved: 2195[Submit][Statu ...

  4. [bzoj2733][HNOI2012]永无乡_权值线段树_线段树合并

    永无乡 bzoj-2733 HNOI-2012 题目大意:题目链接. 注释:略. 想法: 它的查询操作非常友善,就是一个联通块内的$k$小值. 故此我们可以考虑每个联通块建一棵权值线段树. 这样的话每 ...

  5. BZOJ2733 [HNOI2012]永无乡 【线段树合并】

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

  7. BZOJ2733[HNOI2012]永无乡——线段树合并+并查集+启发式合并

    题目描述 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达 ...

  8. bzoj2733: [HNOI2012]永无乡 线段树合并

    永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以从一个岛 到达另一个岛. ...

  9. BZOJ2733: [HNOI2012]永无乡(线段树合并)

    Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...

随机推荐

  1. c# enum 解析

    解析定义的枚举 public enum OrderPaymentStatus { /// <summary> /// 未支付 /// </summary> [Descripti ...

  2. JVM监控远程服务器

    1. 首先配置服务器端,进入服务器tomcat的bin目录下,打开catalina.sh配置文件,xxx为服务器配置路径. # cd /xxx/apache-tomcat-/bin # vim cat ...

  3. .NET邮件发送详情

    ①百度下载个Free Smtp Server ②下载完成后,打开进去,点击左上角的options,弹出窗口,进行如下图选项即可(一般默认已正确选中),然后我们可以把这软件关了. (下次你重启电脑时,也 ...

  4. django 增删改查操作 数据库Mysql

    下面介绍一下django增删改查操作: 1.view.py # -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom dja ...

  5. ubuntu16.04图形界面安装中文输入法,中文展示

    打开system Settings 设置   打开设置语言   安装Language Support   点击installed languages 选择chinese 打勾,安装   安装IBus框 ...

  6. PK3Err0040

    PK3Err0040 The target device is not ready for debugging. Please check your configuration bit setting ...

  7. 嵌入式码农的10年Bug调试经验,值得一看

    下面这些都是我经历过的会导致难点bug的问题: 1.事件顺序.在处理事件时,提出下列问题会很有成效:事件可以以不同的顺序到达吗?如果我们没有接收到此事件会怎么样?如果此事件接连发生两次会怎么样?哪怕通 ...

  8. 20145214 《Java程序设计》第8周学习总结

    20145214 <Java程序设计>第8周学习总结 教材学习内容总结 日志API 使用日志的起点是Logger类,Logger类的构造函数标示为protected,不是java.util ...

  9. PHP 将一个字符串部分字符用$re替代隐藏

    <?php/** * 将一个字符串部分字符用$re替代隐藏 * @param string $string 待处理的字符串 * @param int $start 规定在字符串的何处开始, * ...

  10. WPF+数据库+三层

    1.计算类 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespac ...