启发式合并?!

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

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

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. netty之粘包分包的处理

    1.netty在进行字节数组传输的时候,会出现粘包和分包的情况.当个数据还好,如果数据量很大.并且不间断的发送给服务器,这个时候就会出现粘包和分包的情况. 2.简单来说:channelBuffer在接 ...

  2. sql中的几种连接类型

    一.连接类型简介 在sql中单表查询的几率相对来说比较少,随着数据库的日益复杂,多表关联的情况越来越多,在多表关联的情况下存在多种关联的类型, 1.自关联(join或inner join) 2.左外关 ...

  3. ToString的格式化字符串

    如下: , , ).ToString(@"d\.hh\:mm\:ss"); var b = DateTimeOffset.Now.ToString("yyyy-MM-dd ...

  4. selenium,unittest——参数化url,并多线程加快脚本运行速度

    利用参数化连续打开网页: #encoding=utf-8import unittestimport paramunittestimport timefrom selenium import webdr ...

  5. tpo-10 C1 How to get photographs exhibited

    第 1 段 1.Listen to a conversation between a student and her Photography professor. 听一段学生和摄影学教授的对话. 第 ...

  6. Python全栈 MongoDB 数据库(Mongo、 正则基础、一篇通)

                  终端命令:       在线安装:         sudo apt-get install mongodb         默认安装路径 :  /var/lib/mong ...

  7. CsvHelper文档-1前言

    CsvHelper文档-1前言 英文文档链接地址:CsvHelper Document 开源项目地址:CsvHelper 翻译于2018-1-5,原本可能会随时更新: 每一段代码都是经过我实际测试的, ...

  8. POJ 1696 Space Ant(凸包变形)

    Description The most exciting space discovery occurred at the end of the 20th century. In 1999, scie ...

  9. var,let,const,三种申明变量的整理

    javascript,正在慢慢变成一个工业级语言,势力慢慢渗透ios,安卓,后台 首先let,是局部变量,块级作用域:var全局的,const是常量,也就是只读的: 一行demo说明 for (var ...

  10. 直接管理内存——new和delete

    一.运算符new 1. 使用new动态分配对象 在自由空间分配的内存是无名的,故new无法为其分配的对象命名,而是返回一个指向该对象的指针 int *pi = new int; //pi指向一个动态分 ...