This repository has been archived on 2022-06-22. You can view files and clone it, but cannot push or open issues or pull requests.
usaco-guide/content/6_Advanced/Treaps.mdx
2020-07-17 18:29:45 -07:00

119 lines
2.7 KiB
Text

---
id: treaps
title: "Treaps"
author: Benjamin Qi
description: "?"
prerequisites:
- Platinum - Range Update Range Query
frequency: 2
---
import { Problem } from "../models";
export const metadata = {
problems: {
treeRot: [
new Problem("POI", "Tree Rotations 2", "https://szkopul.edu.pl/problemset/problem/b0BM0al2crQBt6zovEtJfOc6/site/?key=statement", "Normal", false, [], ""),
]
}
};
## Merging
## Splitting
## Merging (Arbitrary Keys)
<Problems problems={metadata.problems.treeRot} />
<Spoiler title="Tree Rotations 2 Solution">
Apparently [this paper](https://www.cs.cmu.edu/~scandal/papers/treaps-spaa98.pdf) proves that this runs in $O(n\log n)$.
```cpp
int n;
ll ans, inv;
typedef struct tnode* pt;
struct tnode {
int pri, val; pt c[2]; // essential
int sz; // for range queries
tnode (int _val) {
pri = rng(); val = _val;
sz = 1; c[0] = c[1] = NULL;
}
};
int getsz(pt x) { return x?x->sz:0; }
pt calc(pt x) {
x->sz = 1+getsz(x->c[0])+getsz(x->c[1]);
return x;
}
pair<pt,pt> split(pt t, int v) { // >= v goes to the right
if (!t) return {t,t};
if (t->val >= v) {
auto p = split(t->c[0], v); t->c[0] = p.s;
return {p.f,calc(t)};
} else {
auto p = split(t->c[1], v); t->c[1] = p.f;
return {calc(t),p.s};
}
}
pt merge(pt a, pt b) {
if (!a || !b) return a?:b;
if (a->pri > b->pri) {
auto B = split(b,a->val);
inv += (ll)(1+getsz(a->c[0]))*getsz(B.s);
a->c[0] = merge(a->c[0],B.f); a->c[1] = merge(a->c[1],B.s);
return calc(a);
} else {
auto A = split(a,b->val);
inv += (ll)getsz(A.f)*(1+getsz(b->c[1]));
b->c[0] = merge(A.f,b->c[0]); b->c[1] = merge(A.s,b->c[1]);
return calc(b);
}
}
pt go() {
int x; re(x);
if (x) return new tnode(x);
pt L = go(); pt R = go();
ll tot = (ll)L->sz*R->sz; inv = 0;
pt cur = merge(L,R); assert(inv <= tot); // dbg("HUH",tot,inv);
ans += min(inv,tot-inv);
return cur;
}
int main() {
setIO(); re(n); go();
ps(ans);
}
```
</Spoiler>
<Optional>
[This](https://codeforces.com/blog/entry/67980) CF post describes a more general version of the problem above.
</Optional>
## Tutorial
- [Quora](https://threads-iiith.quora.com/Treaps-One-Tree-to-Rule-em-all-Part-1)
- [PPT](https://docs.google.com/presentation/d/14xgtdDWnIBwmJRAuIdZ8FvLZcX9uRxnNoGOGAQRDIvc/edit?usp=sharing)
- Samuel Hsiang Guide (see resources)
## Problems
- [Old Gold - Airplane Boarding](http://www.usaco.org/index.php?page=viewproblem2&cpid=402)
- [Strings](https://csacademy.com/contest/archive/task/strings/) [](181)
- [Points & Distances](https://www.hackerearth.com/problem/algorithm/septembereasy-points-and-distances-d30d0e6b/description/) [](185)
IOI 2013 Game - https://oj.uz/submission/242393
A2OJ: https://a2oj.com/category?ID=14
?