BZOJ[2733][HNOI2012]永无乡 Splay启发式合并
题目链接
题目大意及线段树合并解法在这里
每合并两个点,将它俩启发式合并
启发式合并,即把小的暴力往大的那里插
说按前序遍历插复杂度会极其优越??
第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启发式合并相关推荐
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- [BZOJ2733] [HNOI2012] 永无乡 (splay启发式合并)
Description 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 n 来表示.某些岛之间由巨大的桥连接,通过桥可以 ...
- 【BZOJ 2733】 [HNOI2012]永无乡|Splay启发式合并
代码能力太弱 #include <cstdio> #include <iostream> #include <algorithm> using namespace ...
- BZOJ 2733: [HNOI2012]永无乡 启发式合并treap
2733: [HNOI2012]永无乡 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- bzoj 2733: [HNOI2012]永无乡(线段树启发式合并)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3850 Solved: 2061 [Submit][Sta ...
- 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 ...
- BZOJ 2733: [HNOI2012]永无乡
线段树合并 #include<cstdio> using namespace std; int cnt,F[100005],ls[2000005],rs[2000005],ID[20000 ...
- [Bzoj2733][Hnoi2012] 永无乡(BST)(Pb_ds tree)
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 4108 Solved: 2195 [Submit][Sta ...
- P3224 [HNOI2012]永无乡(并查集+权值线段树合并/平衡树)
[HNOI2012]永无乡 Code1 权值线段树天然支持merge,线段树上二分求第k小 #include<bits/stdc++.h>using namespace std; usin ...
最新文章
- Nexenta和ParaScale发布开源存储产品
- em算法怎么对应原有分类_EM算法原理
- java8 list 行转列_Java14 都来了,你还不会用 Java8吗?
- 7种方法帮助企业改进软件维护效率
- 图像的灰度级数越多越好_MATLAB-数字图像处理 图像直方图归一化
- SessionHelper
- flex应用中如何关闭浏览器
- 有哪些特点_锌钢栅栏有哪些特点?锌钢栅栏特点有哪些?
- DVWA系列之11 Brute Force中的密码绕过
- C++ string转char* string转char[]
- 阅读笔记-JavaScript学习指南
- 光伏发电最大功率点(MPPT)跟踪技术
- 典型相关分析(CCA)
- 东南亚跨境电商shopee平台有什么选品渠道?
- 群晖 VMM虚拟机安装openwrt软路由做单臂旁路由
- 《新年Flag》2019年“新年Flag” - 新目标 学习计划
- Vue $once 函数
- 分治算法在排课系统中的分析与应用的改进
- 神经网络按结构可以分为,神经网络主要包括哪些
- 【59元 第二件1元】SIMEITOL/姿美堂玛卡片 蓝玛咖片MACA 60片
热门文章
- 延续辉煌:苹果CEO蒂姆·库克,《蒂姆·库克传》书评
- 如何实现更好的推荐结果?腾讯微信提出深度反馈网络
- 歌谣学前端之箭头函数2
- GRAINS: Generative Recursive Autoencoders for INdoor Scenes 2019 TOG(家居布局、树结构网络、RvNN)
- leet_452_find_min_arrow_shots(用最少数量的箭引爆气球)
- Elsevier 期刊 Editorial Manager (EM)投稿系统踩坑
- 华为手机7个超实用的功能,关键时刻帮你大忙,赶紧开启吧!
- 今年计算机/软件等专业调剂信息集合!
- op 圣诞节活动_在圣诞节前的夜晚–一个编码者的梦想
- 便宜投影仪值得推荐吗,当贝X3高亮投影仪更值得看