2733: [HNOI2012]永无乡

题意:加边,询问一个连通块中k小值


终于写了一下splay启发式合并
本题直接splay上一个节点对应图上一个点就可以了
并查集维护连通性
合并的时候,把size小的树的所有节点插入到size大的中,每个点最多插入log次,复杂度\(O(nlogn*insert\ time)\)
然后主席说如果按照顺序插入,插入的复杂度均摊\(O(1)\),总的复杂度\(O(nlogn)\),随便中序遍历一下就有序了.貌似并没有更快

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define lc t[x].ch[0]
#define rc t[x].ch[1]
#define pa t[x].fa
const int N=1e5+5;
inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}int n, m, val[N], x, y, Q; char s[5];
int fa[N];
inline int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
struct SplayTree{struct meow{int ch[2], fa, size, v;}t[N];int sz, root;inline void ini() {for(int i=1; i<=n; i++) t[i].v=val[i], t[i].size=1;}inline int wh(int x) {return t[pa].ch[1] == x;}inline void update(int x) {t[x].size = t[lc].size + t[rc].size + 1;}inline void rotate(int x) {int f=t[x].fa, g=t[f].fa, c=wh(x);if(g) t[g].ch[wh(f)]=x; t[x].fa=g;t[f].ch[c] = t[x].ch[c^1]; t[t[f].ch[c]].fa=f;t[x].ch[c^1]=f; t[f].fa=x;update(f); update(x);}inline void splay(int x, int tar) {for(; pa!=tar; rotate(x))if(t[pa].fa != tar) rotate(wh(x)==wh(pa) ? pa : x);if(tar==0) root=x;}inline void insert(int p) { int x=root, f=0, v=t[p].v; while(x) f=x, x= v<t[x].v ? lc : rc;x=p; t[f].ch[v>t[f].v]=x; t[x].fa=f; splay(x, 0);}int q[N], p;void order(int x) {int l=lc, r=rc;lc=rc=pa=0; t[x].size=1;if(l) order(l);insert(x);if(r) order(r);}void Merge(int x, int y) {if(x==y) return;splay(x, 0); splay(y, 0);if(t[x].size > t[y].size) swap(x, y);   fa[x]=y; root=y;order(x);}int kth(int x, int k) { splay(x, 0); int lsize=0; while(x) {int _=lsize+t[lc].size; if(k<=_) x=lc;else if(k==_+1) return x;else lsize=_+1,x=rc;}return -1;}
}S;int main() {freopen("in","r",stdin);n=read(); m=read();for(int i=1; i<=n; i++) val[i]=read(), fa[i]=i;S.ini();for(int i=1; i<=m; i++) x=find(read()), y=find(read()), S.Merge(x, y);Q=read();for(int i=1; i<=Q; i++) {scanf("%s",s); x=find(read()); y=read();if(s[0]=='B') y=find(y), S.Merge(x, y);else printf("%d\n", S.kth(x, y));}
}

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

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

    题目链接 题目大意及线段树合并解法在这里 每合并两个点,将它俩启发式合并 启发式合并,即把小的暴力往大的那里插 说按前序遍历插复杂度会极其优越?? 第k大是平衡树基本操作 代码如下: #include ...

  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. Ajax缓存解决办法
  2. ActiveMQ专题
  3. Codeforces Round #114 (Div. 1) A. Wizards and Trolleybuses 物理题
  4. Wordpress简约昼夜切换主页导航
  5. 接口定义【领域对象】
  6. python爬虫10万信息mysql_python爬虫:爬取易迅网价格信息,并写入Mysql数据库
  7. Performance Tuning
  8. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构
  9. 微信公众号后台开发---永久素材失效
  10. 直播礼物特效新格式-Pag格式
  11. 魔兽世界服务器维护有哪些内容,魔兽世界wow服务器实装维护公告内容详情介绍_魔兽世界维护公告_快吧游戏...
  12. Linux查看服务器SN序列码
  13. 嫂嫂学计算机,开心一刻,,老妈催婚, 含泪让男闺蜜冒充, 进门后嫂子愣住了…
  14. python图像轮廓识别_Python+OpenCV图像处理(十六)—— 轮廓发现
  15. 推荐一个windows下使用的无广告解压缩软件
  16. A First Course in Database Systems(数据库基础教程 第三版)课后答案——2.3.1\2.3.2\2.4.1
  17. Android 实现从网络获取视频URL显示在视频播放器(IjkVideoView)能全屏和保存视频到手机的功能
  18. ILI9881C-0D调试总结
  19. 随笔日记2018 4.10 关于多选框
  20. Lichee(二) 在sun4i_crane平台下的编译

热门文章

  1. BJUI验证后弹窗不显示
  2. redis缓存路由为空_Springboot使用RedisTemplate优雅地操作redis
  3. 神策数据张涛:企业服务客户全生命周期运营三步曲:执行反馈
  4. 环球网校签约神策数据,数据赋能教育行业创新升级
  5. 高薪寻人 | 2018 “神策杯”高校算法大师赛 6 强诞生,【招人】进行时……
  6. 20051020:该办宽带了
  7. 【trie树】HDU1247Hat’s Words
  8. Extjs使用备忘录
  9. 关于exchange 2013输入账号密码后owa空白页解决方法
  10. oracle对象之存储函数