博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2012]永无乡 线段树合并
阅读量:5040 次
发布时间:2019-06-12

本文共 1919 字,大约阅读时间需要 6 分钟。

[HNOI2012]永无乡

线段树合并练手题,写这篇博客只是为了给我的找个板子题。

并查集维护连通性,对于不在同一个连通块内的合并操作每次直接合并两颗线段树,复杂度\(O(n \log n)\)

//written by newbiechd#include 
#define R register#define I inlineusing namespace std;const int N = 100003;int f[N], id[N], rt[N], T;struct segtree { int p, q, s;}e[N << 5];I int find(int x) { R int r = x, y; while (f[r] ^ r) r = f[r]; while (x ^ r) y = f[x], f[x] = r, x = y; return r;}void insert(int &k, int l, int r, int x) { k = ++T, ++e[k].s; if (l == r) return ; R int m = (l + r) >> 1; if (x <= m) insert(e[k].p, l, m, x); else insert(e[k].q, m + 1, r, x);}int merge(int k, int t, int l, int r) { if (!k) return t; if (!t) return k; e[k].s += e[t].s; if (l == r) return k; R int m = (l + r) >> 1; e[k].p = merge(e[k].p, e[t].p, l, m), e[k].q = merge(e[k].q, e[t].q, m + 1, r); return k;}int query(int k, int l, int r, int x) { if (l == r) return l; R int m = (l + r) >> 1, t = e[e[k].p].s; if (x <= t) return query(e[k].p, l, m, x); else return query(e[k].q, m + 1, r, x - t);}int main() { R int n, m, Q, i, x, y, z; R char opt[2]; scanf("%d%d", &n, &m); for (i = 1; i <= n; ++i) f[i] = i, scanf("%d", &z), id[z] = i, insert(rt[i], 1, n, z); for (i = 1; i <= m; ++i) scanf("%d%d", &x, &y), x = find(x), y = find(y), f[y] = x, rt[x] = merge(rt[x], rt[y], 1, n); scanf("%d", &Q); for (i = 1; i <= Q; ++i) { scanf("%s%d%d", opt, &x, &y), x = find(x); if (opt[0] == 'B') { y = find(y); if (y ^ x) f[y] = x, merge(rt[x], rt[y], 1, n); } else if (y > e[rt[x]].s) printf("-1\n"); else printf("%d\n", id[query(rt[x], 1, n, y)]); } return 0;}

转载于:https://www.cnblogs.com/cj-chd/p/10433154.html

你可能感兴趣的文章
Activity和Fragment生命周期对比
查看>>
OAuth和OpenID的区别
查看>>
android 分辨率自适应
查看>>
查找 EXC_BAD_ACCESS 问题根源的方法
查看>>
国外媒体推荐的5款当地Passbook通行证制作工具
查看>>
日常报错
查看>>
list-style-type -- 定义列表样式
查看>>
hibernate生成表时,有的表可以生成,有的却不可以 2014-03-21 21:28 244人阅读 ...
查看>>
mysql-1045(28000)错误
查看>>
Ubuntu 编译出现 ISO C++ 2011 不支持的解决办法
查看>>
1.jstl c 标签实现判断功能
查看>>
Linux 常用命令——cat, tac, nl, more, less, head, tail, od
查看>>
超详细的Guava RateLimiter限流原理解析
查看>>
VueJS ElementUI el-table 的 formatter 和 scope template 不能同时存在
查看>>
Halcon一日一练:图像拼接技术
查看>>
Swift - RotateView
查看>>
iOS设计模式 - 中介者
查看>>
centos jdk 下载
查看>>
HDU 1028 Ignatius and the Princess III(母函数)
查看>>
关于多路复用器的综合结果
查看>>