高级数据结构【Splay相关,可持久化数据结构、重量平衡树、仙人掌系列、支配树、划分树】 Summary
知识点总结
这个专题好像没什么新算法,标题里的重量平衡树、仙人掌、划分树好像都没用到。。。 都是一些可持久化数据结构和Splay的题目 最多多了一个支配树,在专门那篇Blog里也有学习资料
Problems
Hdu2475 Box(Splay)
Hdu5923 Prediction(并查集)
Hdu2665 Kth number(主席树)
主席树模板,只是想吐槽一下题目里说好的求第k大,结果写成第k小才A
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using namespace std;
const int Maxn = 100000 + 100;
struct node
{
int id, val;
}A[Maxn];
inline int cmp (node a, node b)
{
return a.val < b.val;
}
int N, M;
int Cnt;
struct Tree
{
int lson, rson, val;
}Tree[Maxn * 20];
int Root[Maxn], Rank[Maxn];
inline void build (int &root, int l, int r)
{
root = ++ Cnt;
Tree[root].val = 0;
if (l == r) return ;
int mid = (l + r) >> 1;
build(Tree[root].lson, l, mid);
build(Tree[root].rson, mid + 1, r);
}
inline void Insert (int pre, int &now, int l, int r, int x)
{
now = ++ Cnt;
Tree[now].lson = Tree[pre].lson;
Tree[now].rson = Tree[pre].rson;
Tree[now].val = Tree[pre].val + 1;
if (l == r) return ;
int mid = (l + r) >> 1;
if (x <= mid) Insert(Tree[pre].lson, Tree[now].lson, l, mid, x);
else Insert(Tree[pre].rson, Tree[now].rson, mid + 1, r, x);
}
inline int Query (int pre, int now, int l, int r, int x)
{
if (l == r)
return l;
int mid = (l + r) >> 1;
int left = Tree[Tree[now].lson].val - Tree[Tree[pre].lson].val;
if (left >= x)
return Query(Tree[pre].lson, Tree[now].lson, l, mid, x);
else return Query(Tree[pre].rson, Tree[now].rson, mid + 1, r, x - left);
}
int main()
{
freopen("A.in", "r", stdin);
freopen("A.out", "w", stdout);
int t;
scanf("%d", &t);
while (t--)
{
Cnt = 0;
memset(A, 0, sizeof A);
memset(Root, 0, sizeof Root);
memset(Tree, 0, sizeof Tree);
memset(Rank, 0, sizeof Rank);
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; ++i)
scanf("%d", &A[i].val), A[i].id = i;
sort(A + 1, A + N + 1, cmp);
for (int i = 1; i <= N; ++i) Rank[A[i].id] = i;
build(Root[0], 1, N);
for (int i = 1; i <= N; ++i)
Insert(Root[i - 1], Root[i], 1, N, Rank[i]);
for (int i = 1; i <= M; ++i)
{
int x, y, k;
scanf("%d%d%d", &x, &y, &k);
printf("%d\n", A[Query(Root[x - 1], Root[y], 1, N, k)].val);
}
}
return 0;
}
Hdu4757 Tree(可持久化01Trie)
Hdu5324 Boring Class(树套树)
POJ3580 SuperMemo(Splay)
Hdu6041 I Curse Myself(tarjan)
Hdu6041 I Curse Myself(tarjan)
Hdu4694 Important Sisters(支配树)
Hdu4694 Important Sisters(支配树)
Hdu4417 Super Mario(主席树)
1 |
|