[洛谷P4847]银河英雄传说V2
题目大意:有$n(n\leqslant2\times10^5)$个序列,有$m(m\leqslant2\times10^5)$个操作,分三种:
1. $M\;x\;y:$把$x$所在的序列放在$y$所在序列之后
2. $D\;x:$把$x$所在的序列从它前面断开
3. $Q\;x\;y:$询问若$x,y$在同一序列中,它们之间的元素和
题解:平衡树,合并就正常合并,注意是把$x$放到$y$后,关于找$x$所在的序列,就记录每个节点的父亲,直接向上跳父亲就可以了,在分裂时注意维护父亲。
求元素的排名就看一下它是不是它父亲的右儿子,是的话把它兄弟的大小加上。
询问就记录一个区间和即可。
卡点:无
C++ Code:
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#define maxn 200010 namespace Treap {
int pri[maxn], lc[maxn], rc[maxn], fa[maxn], sz[maxn], V[maxn];
long long S[maxn];
int ta, tb, tmp, res;
inline void nw(int pos, int x) {
pri[pos] = rand();
S[pos] = V[pos] = x;
lc[pos] = rc[pos] = fa[pos] = 0;
sz[pos] = 1;
}
inline int update(int rt) {
const int lc = Treap::lc[rt], rc = Treap::rc[rt];
if (lc) fa[lc] = rt;
if (rc) fa[rc] = rt;
sz[rt] = sz[lc] + sz[rc] + 1;
S[rt] = S[lc] + S[rc] + V[rt];
return rt;
}
void split(int rt, int k, int &x, int &y) {
if (!rt) x = y = 0;
else {
if (sz[lc[rt]] >= k) {
split(lc[rt], k, x, lc[rt]);
fa[x] = fa[rt] = 0;
y = update(rt);
} else {
split(rc[rt], k - sz[lc[rt]] - 1, rc[rt], y);
fa[rt] = fa[y] = 0;
x = update(rt);
}
}
}
int merge(int x, int y) {
if (!x || !y) return x | y;
if (pri[x] < pri[y]) { rc[x] = merge(rc[x], y); return update(x); }
else { lc[y] = merge(x, lc[y]); return update(y); }
}
inline int gtrnk(int x) {
res = sz[lc[x]] + 1;
while (x) {
if (rc[fa[x]] == x) res += sz[lc[fa[x]]] + 1;
x = fa[x];
}
return res;
}
inline int gtrt(int x) {
while (fa[x]) x = fa[x];
return x;
} inline void Merge(int x, int y) {
x = gtrt(x), y = gtrt(y);
if (x == y) return ;
merge(y, x);
}
inline void Split(int x) {
int rk = gtrnk(x); x = gtrt(x);
split(x, rk - 1, ta, tb);
}
inline void query(int x, int y) {
int root = gtrt(x);
if (root != gtrt(y)) {
puts("-1");
return ;
}
int rkx = gtrnk(x), rky = gtrnk(y);
if (rkx > rky) std::swap(rkx, rky);
split(root, rky, ta, tb);
split(ta, rkx - 1, ta, tmp);
printf("%lld\n", S[tmp]);
merge(ta, merge(tmp, tb));
}
} int n, m; int main() {
srand(20040826);
scanf("%d%d", &n, &m);
for (int i = 1, x; i <= n; ++i) {
scanf("%d", &x);
Treap::nw(i, x);
}
while (m --> 0) {
char op;
int x, y;
scanf("%1s%d", &op, &x);
switch (op) {
case 'M':
scanf("%d", &y);
Treap::Merge(x, y);
break;
case 'D':
Treap::Split(x);
break;
case 'Q':
scanf("%d", &y);
Treap::query(x, y);
}
}
return 0;
}
[洛谷P4847]银河英雄传说V2的更多相关文章
- P4847 银河英雄传说V2 题解(Splay)
题目链接 P4847 银河英雄传说V2 解题思路 我天哪!!!\(splay\)在\(rotate\)的时候先\(upd(y)\)再\(upd(x)\)!!以后不能再因为这个\(WA\)一晚上了!!! ...
- NOI2002 洛谷 P1196 银河英雄传说
神奇的并查集问题 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩 ...
- 洛谷—— P1196 银河英雄传说
https://www.luogu.org/problem/show?pid=1196 题目描述 公元五八○一年,地球居民迁至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始 ...
- 洛谷 [p1196] 银河英雄传说
所谓带权并查集 本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,dis[]维护编号为i的战舰到fa[i]之间的距离 ...
- 洛谷P1196 银河英雄传说
大意:你有30000个队列,第i个队列中只有i 有T个操作,1,把某个队列头接到另一个队列尾. 2,问两个元素之间的距离. 本题主要有三种解法. ①带权并查集. 具体来说就是,并查集维护当前集合的大小 ...
- NOI2002_ Galaxy银河英雄传说86
NOI2002_ Galaxy银河英雄传说86 公元五八○一年,地球居民迁移至金牛座α第二行星,:宇宙历七九九年,银河系的两大军事集团在巴米利恩星:杨威利擅长排兵布阵,巧妙运用各种战术屡次以少 ...
- NOI2002 银河英雄传说
P1196 银河英雄传说 367通过 1.1K提交 题目提供者该用户不存在 标签并查集NOI系列2001(或之前) 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 莱因哈特什么鬼? 私人代码 ...
- [洛谷P1338] 末日的传说
洛谷题目链接:末日的传说 题目描述 只要是参加jsoi活动的同学一定都听说过Hanoi塔的传说:三根柱子上的金片每天被移动一次,当所有的金片都被移完之后,世界末日也就随之降临了. 在古老东方的幻想乡, ...
- 加权并查集(银河英雄传说,Cube Stacking)
洛谷P1196 银河英雄传说 题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展.宇宙历七九九年,银河系的两大军事集团在 ...
随机推荐
- [hdu 6184 Counting Stars(三元环计数)
hdu 6184 Counting Stars(三元环计数) 题意: 给一张n个点m条边的无向图,问有多少个\(A-structure\) 其中\(A-structure\)满足\(V=(A,B,C, ...
- vijos p1027休息中的小呆
休息中的小呆 描述 当大家在考场中接受考验(折磨?)的时候,小呆正在悠闲(欠扁)地玩一个叫“最初梦想”的游戏.游戏描述的是一个叫pass的有志少年在不同的时空穿越对抗传说中的大魔王chineseson ...
- ORB-SLAM(十)LoopClosing Sim3求解
主要参考这篇论文 Horn B K P. Closed-form solution of absolute orientation using unit quaternions[J]. JOSA A, ...
- Oracle 字段拆分替换在合并成一条
看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...
- 错误码:2003 不能连接到 MySQL 服务器在 (10061)
今天在ubuntu上安装了mysql服务器,在windows上用客户端软件连接mysql服务器时,出现错误: 错误码: 不能连接到 MySQL 服务器在 () 折腾来折腾去没搞好,防火墙也关了,330 ...
- Python安装教程最新版
Python安装教程最新版 目前Python官网已经更新到了最新版Python 3.7.1, 相比Python 2系列,它的兼容性不是太好, 不过应该会在不久的将来会全面解决.它的安装比较容易,具体步 ...
- 41. Maximum Subarray
Description Given an array of integers, find a contiguous subarray which has the largest sum. The su ...
- 标注点(Labeled Point)
标注点LabeledPoint是一种带有标签(Label/Response)的本地向量,它可以是稠密或者是稀疏的.在MLlib中,标注点在监督学习算法中被使用.由于标签是用双精度浮点型来存储的,故标注 ...
- POJ 3845 Fractal(计算几何の旋转缩放)
Description Fractals are really cool mathematical objects. They have a lot of interesting properties ...
- 视频播放截图及简要文字介绍——Thunder团队
视频播放截图及简要文字介绍 图一:团队Logo ——从此我们有了自己的标志 图二:扫描本地书籍 ——可阅读本地的喜爱书籍 图三:在本地添加自己喜爱的图书 ——将自己喜爱的书籍加入书架,方便阅读 图四: ...