Skip to content

Commit 5149ba2

Browse files
committed
LibreOJ: 105
文艺平衡树
1 parent 61f974b commit 5149ba2

File tree

1 file changed

+99
-0
lines changed

1 file changed

+99
-0
lines changed

LibreOJ/105.cpp

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
/**
2+
* @file 105.cpp
3+
* @author Macesuted ([email protected])
4+
* @date 2022-05-01
5+
*
6+
* @copyright Copyright (c) 2022
7+
*
8+
*/
9+
10+
#include <bits/stdc++.h>
11+
using namespace std;
12+
13+
bool mem1;
14+
15+
class FhqTreap {
16+
private:
17+
struct Node {
18+
Node *l, *r;
19+
int val, rnk, siz;
20+
bool rev;
21+
Node(int val_) { l = r = NULL, val = val_, rnk = rand(), siz = 1, rev = false; }
22+
};
23+
24+
Node* root;
25+
26+
int getSiz(Node* p) { return p ? p->siz : 0; }
27+
void rev(Node* p) { return p && (swap(p->l, p->r), p->rev ^= true), void(); }
28+
void pushDown(Node* p) { return p && p->rev && (rev(p->l), rev(p->r), p->rev = false), void(); }
29+
void pushUp(Node* p) { return p->siz = 1 + getSiz(p->l) + getSiz(p->r), void(); }
30+
void split(Node* p, Node*& t1, Node*& t2, int s) {
31+
if (!p) return t1 = t2 = NULL, void();
32+
pushDown(p);
33+
if (1 + getSiz(p->l) <= s)
34+
t1 = p, split(p->r, t1->r, t2, s - 1 - getSiz(p->l));
35+
else
36+
t2 = p, split(p->l, t1, t2->l, s);
37+
return pushUp(p);
38+
}
39+
void merge(Node*& p, Node* t1, Node* t2) {
40+
if (!t1) return p = t2, void();
41+
if (!t2) return p = t1, void();
42+
if (t1->rnk < t2->rnk)
43+
pushDown(p = t1), merge(p->r, t1->r, t2);
44+
else
45+
pushDown(p = t2), merge(p->l, t1, t2->l);
46+
return pushUp(p);
47+
}
48+
void print(Node* p) {
49+
if (!p) return;
50+
pushDown(p);
51+
print(p->l), cout << p->val << ' ', print(p->r);
52+
return;
53+
}
54+
55+
public:
56+
FhqTreap(void) { root = NULL; }
57+
void build(int n) {
58+
for (int i = 1; i <= n; i++) merge(root, root, new Node(i));
59+
return;
60+
}
61+
void reverse(int l, int r) {
62+
Node *tc = NULL, *tr = NULL;
63+
split(root, root, tr, r), split(root, root, tc, l - 1);
64+
rev(tc);
65+
merge(root, root, tc), merge(root, root, tr);
66+
return;
67+
}
68+
void print(void) { return print(root), cout << endl, void(); }
69+
} FHQ;
70+
71+
void solve(void) {
72+
int n, m;
73+
cin >> n >> m;
74+
FHQ.build(n);
75+
for (int i = 1; i <= m; i++) {
76+
int l, r;
77+
cin >> l >> r;
78+
FHQ.reverse(l, r);
79+
}
80+
FHQ.print();
81+
return;
82+
}
83+
84+
bool mem2;
85+
86+
int main() {
87+
ios::sync_with_stdio(false);
88+
#ifdef LOCAL
89+
cerr << "Memory Cost: " << abs(&mem1 - &mem2) / 1024. / 1024. << "MB" << endl;
90+
#endif
91+
92+
int _ = 1;
93+
while (_--) solve();
94+
95+
#ifdef LOCAL
96+
cerr << "Time Cost: " << clock() * 1000. / CLOCKS_PER_SEC << "MS" << endl;
97+
#endif
98+
return 0;
99+
}

0 commit comments

Comments
 (0)