题目链接

题目大意及线段树合并解法在这里

每合并两个点,将它俩启发式合并
启发式合并,即把小的暴力往大的那里插
说按前序遍历插复杂度会极其优越??

第k大是平衡树基本操作

代码如下:

#include<algorithm>
#include<ctype.h>
#include<cstdio>
#define N 100050
using namespace std;
inline int read(){int x=0,f=1;char c;do c=getchar(),f=c=='-'?-1:f; while(!isdigit(c));do x=(x<<3)+(x<<1)+c-'0',c=getchar(); while(isdigit(c));return x*f;
}
int n,m,x,y,fx,fy,t;
int f[N],pre[N];
char s[26];
int Find(int x){return f[x]==x?f[x]:f[x]=Find(f[x]);
}
struct Node{Node *ch[2],*fa;int x,siz;Node(int);inline int dir(){if(fa->ch[0]==this) return 0;if(fa->ch[1]==this) return 1;return -1;}inline void maintain(){siz=ch[0]->siz+ch[1]->siz+1;return;}inline int cmp(int k){if(k==x) return -1;return k<x?0:1;}
}*null,*root[N],*tmp;
Node::Node(int _):x(_){siz=1;fa=ch[0]=ch[1]=null;
}
inline void init(){null=new Node(-1);null->ch[0]=null->ch[1]=null->fa=null;null->siz=0;
}
void print(Node *x){///Debugif(x==null) return;printf("%d  ",x->x);print(x->ch[0]);print(x->ch[1]);
}
inline void Rotate(Node *x,int d){Node *k=x->ch[d^1];x->ch[d^1]=k->ch[d];if(x->ch[d^1]!=null) x->ch[d^1]->fa=x;k->ch[d]=x;if(x->fa!=null) x->fa->ch[x->dir()]=k;k->fa=x->fa;x->fa=k;x->maintain();k->maintain();
}
inline void Splay(Node *x,Node *y,int num){while(x->fa!=y){if(x->fa->fa!=y && x->dir()==x->fa->dir())Rotate(x->fa->fa,x->dir()^1);Rotate(x->fa,x->dir()^1);}x->maintain();if(y==null) root[num]=x;
}
void Insert(Node *&x,int k,Node *fa){if(x==null){x=new Node(k);x->fa=fa;tmp=x;return;}int d=x->cmp(k);Insert(x->ch[d],k,x);x->maintain();
}
inline void AddNew(int x,int k){Insert(root[x],k,null);Splay(tmp,null,x);
}
int K_th(int k,Node *x){if(k==x->ch[0]->siz+1) return x->x;int d=k<=x->ch[0]->siz?0:1;return K_th(k-(d?x->ch[0]->siz+1:0),x->ch[d]);
}
Node *LowerPointer(Node *x,int k){if(x==null) return null;if(k>=x->x) return LowerPointer(x->ch[0],k);Node *t=LowerPointer(x->ch[1],k);return t==null?x:t;
}
Node *UpperPointer(Node *x,int k){if(x==null) return null;if(k<=x->x) return UpperPointer(x->ch[1],k);Node *t=UpperPointer(x->ch[0],k);return t==null?x:t;
}
inline void Delete(int k,int x){Node *a=LowerPointer(root[x],k),*b=UpperPointer(root[x],k);if(a==null && b==null){root[x]=null;return;}if(a==null){Splay(b,null,x);root[x]->ch[0]=null;root[x]->maintain();return;}if(b==null){Splay(a,null,x);root[x]->ch[1]=null;root[x]->maintain();return;}Splay(a,null,x);Splay(b,a,x);root[x]->ch[1]->ch[0]=null;root[x]->ch[1]->maintain();root[x]->maintain();
}
inline void Merge(int tx,int ty){if(tx==ty) return;int x=tx,y=ty;if(root[x]->siz<root[y]->siz) swap(x,y);while(root[y]->siz){int k=K_th(1,root[y]);Delete(k,y);AddNew(x,k);}f[y]=x;
}
int main(){init();n=read();m=read();for(int i=1;i<=n;i++){f[i]=pre[x=read()]=i;root[i]=null;AddNew(i,x);}for(int i=1;i<=m;i++){x=read();y=read();x=Find(x),y=Find(y);Merge(x,y);}m=read();for(int i=1;i<=m;i++){scanf("%s",s+1);if(s[1]=='B'){x=read();y=read();Merge(Find(x),Find(y));}else{x=read();y=read();fx=Find(x);if(root[fx]->siz<y) printf("-1\n");else printf("%d\n",pre[K_th(y,root[fx])]);}}
return 0;
}

BZOJ[2733][HNOI2012]永无乡 Splay启发式合并相关推荐

  1. BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]

    2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...

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

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

  3. 【BZOJ 2733】 [HNOI2012]永无乡|Splay启发式合并

    代码能力太弱 #include <cstdio> #include <iostream> #include <algorithm> using namespace ...

  4. BZOJ 2733: [HNOI2012]永无乡 启发式合并treap

    2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  5. bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)

    2733: [HNOI2012]永无乡 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3850  Solved: 2061 [Submit][Sta ...

  6. P3224 [HNOI2012]永无乡 FHQ-Treap 启发式合并

    题意: B x y B\ x\ y B x y 表示在岛 x x x 与岛 y y y 之间修建一座新桥. Q x k Q\ x\ k Q x k 表示询问当前与岛 x x x 连通的所有岛中第 k ...

  7. BZOJ 2733: [HNOI2012]永无乡

    线段树合并 #include<cstdio> using namespace std; int cnt,F[100005],ls[2000005],rs[2000005],ID[20000 ...

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

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

  9. P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)

    [HNOI2012]永无乡 Code1 权值线段树天然支持merge,线段树上二分求第k小 #include<bits/stdc++.h>using namespace std; usin ...

最新文章

  1. Nexenta和ParaScale发布开源存储产品
  2. em算法怎么对应原有分类_EM算法原理
  3. java8 list 行转列_Java14 都来了,你还不会用 Java8吗?
  4. 7种方法帮助企业改进软件维护效率
  5. 图像的灰度级数越多越好_MATLAB-数字图像处理 图像直方图归一化
  6. SessionHelper
  7. flex应用中如何关闭浏览器
  8. 有哪些特点_锌钢栅栏有哪些特点?锌钢栅栏特点有哪些?
  9. DVWA系列之11 Brute Force中的密码绕过
  10. C++ string转char* string转char[]
  11. 阅读笔记-JavaScript学习指南
  12. 光伏发电最大功率点(MPPT)跟踪技术
  13. 典型相关分析(CCA)
  14. 东南亚跨境电商shopee平台有什么选品渠道?
  15. 群晖 VMM虚拟机安装openwrt软路由做单臂旁路由
  16. 《新年Flag》2019年“新年Flag” - 新目标 学习计划
  17. Vue $once 函数
  18. 分治算法在排课系统中的分析与应用的改进
  19. 神经网络按结构可以分为,神经网络主要包括哪些
  20. 【59元 第二件1元】SIMEITOL/姿美堂玛卡片 蓝玛咖片MACA 60片

热门文章

  1. 延续辉煌:苹果CEO蒂姆·库克,《蒂姆·库克传》书评
  2. 如何实现更好的推荐结果?腾讯微信提出深度反馈网络
  3. 歌谣学前端之箭头函数2
  4. GRAINS: Generative Recursive Autoencoders for INdoor Scenes 2019 TOG(家居布局、树结构网络、RvNN)
  5. leet_452_find_min_arrow_shots(用最少数量的箭引爆气球)
  6. Elsevier 期刊 Editorial Manager (EM)投稿系统踩坑
  7. 华为手机7个超实用的功能,关键时刻帮你大忙,赶紧开启吧!
  8. 今年计算机/软件等专业调剂信息集合!
  9. op 圣诞节活动_在圣诞节前的夜晚–一个编码者的梦想
  10. 便宜投影仪值得推荐吗,当贝X3高亮投影仪更值得看