随笔分类 - 【Splay】
【SPOJ】4487 Can you answer these queries VI
摘要:仍然是询问区间最大连续和,只不过多了插入和删除操作。线段树搞不定了。。伸展树来了。插入删除偷懒那样写了,加了读入优化卡过的。 1 #include<cstdio> 2 #include<iostream> 3 #define MAX(a,b) ((a)>(b)?(a):(b)) 4 #define oo 1000000000 5 #define MAXN 200010 6 using namespace std; 7 int n, a[MAXN]; 8 struct SplayTree { 9 int root, size; 10 int next[MAXN]..
阅读全文
【HDU】2475 Box
摘要:Splay: 1 #include<cstdio> 2 #include<cstring> 3 #define MAXN 100010 4 int first[MAXN], next[MAXN], v[MAXN], e; 5 int seq[MAXN], cnt; 6 int n; 7 bool vis[MAXN]; 8 struct SplayTree { 9 int root; 10 int next[MAXN][2], pre[MAXN]; 11 void Init() { 12 pre[0] = next[0][0] = nex...
阅读全文
【总结】伸展树
摘要:伸展树是一枚二叉树,可以维护一个数列,或者可以作为二叉搜索树,因为无论怎么旋转,它的中序遍历是不变的。1、伸展操作。Splay(x,goal):旋转结点x,使它成为结点goal的儿子。至于旋转,本质上只有左旋和右旋。2、插入。如果作为二叉搜索树,则插入与二叉搜索树一样,最后把该结点旋转到根。如果用于维护一个数列,要求在x位置之前插入val(val可以为一个数字或一个序列),则将第x-1个结点旋转到根,将第x个结点旋转到第x-1个结点的儿子,那么根据中序遍历,val应插入在第x个结点的左儿子。3、删除。与插入同理。4、Select(k)。在二叉搜索树中,对每个结点维护一个num值,如果x左儿子的
阅读全文
【HDU】3726 Graph and Queries
摘要:1 #include<cstdio> 2 #include<iostream> 3 #define MAXN 400010 4 #define PushUp(x) num[x] = num[next[x][0]] + num[next[x][1]] + 1; 5 using namespace std; 6 pair<int, int> edge[MAXN]; 7 int first[MAXN], next[MAXN], cost[MAXN], e; 8 int father[MAXN]; 9 bool del[MAXN]; 10 struct ASK {
阅读全文
【POJ】3580 SuperMemo
摘要:1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define oo 0x7FFFFFFF 5 #define MAXN 200010 6 using namespace std; 7 struct SplayTree { 8 int size, root, top; 9 int st[MAXN], a[MAXN]; 10 int next[MAXN][2], pre[MAXN], key[MAXN], num[MAXN]; 11 int add[MAXN], mi...
阅读全文
【HYSBZ】1500 维修数列
摘要:1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define oo 0x7FFFFFFF 5 #define MAXN 1000010 6 using namespace std; 7 struct SplayTree { 8 int root, size; 9 int a[MAXN], st[MAXN], top; 10 int next[MAXN][2], pre[MAXN], key[MAXN], num[MAXN]; 11 bool flip[MAXN];...
阅读全文
【HDU】3487 Play with Chain
摘要:1 #include<cstdio> 2 #include<algorithm> 3 #define MAXN 300010 4 using namespace std; 5 struct SplayTree { 6 int root, size; 7 int next[MAXN][2], key[MAXN], pre[MAXN], num[MAXN]; 8 bool flip[MAXN], space; 9 inline void PushUp(int x) { 10 num[x] = num[next[x][0]] + n...
阅读全文
【HDU】1754 I Hate It
摘要:线段树: 1 #include<cstdio> 2 #define INF 987654321 3 #define MAXN 200010 4 int tree[MAXN << 2]; 5 inline int MAX(int x, int y) { 6 return x > y ? x : y; 7 } 8 inline void PushUp(int rt) { 9 tree[rt] = MAX(tree[rt << 1], tree[rt << 1 | 1]);10 }11 void Build(int L, int R, int r
阅读全文
【HYSBZ】1503 郁闷的出纳员
摘要:1 #include<cstdio> 2 #define INF 0x7FFFFFFF 3 #define MAXN 100010 4 struct SplayTree { 5 int num[MAXN], next[MAXN][2], pre[MAXN], key[MAXN]; 6 int root, size; 7 inline void PushUp(int x) { 8 num[x] = num[next[x][0]] + num[next[x][1]] + 1; 9 } 10 inline void Rota...
阅读全文
【POJ】3481 Double Queue
摘要:1 #include<cstdio> 2 #define MAXN 100010 3 struct SplayTree { 4 int size, root; 5 int next[MAXN][2], pre[MAXN], key[MAXN], pos[MAXN]; 6 void Init() { 7 size = root = 0; 8 next[0][0] = next[0][1] = 0; 9 }10 void NewNode(int &rt, int father, int val, int id) {11 ...
阅读全文
【HYSBZ】1588 营业额统计
摘要:数据有两组漏了一个数,所以在读入之前要先赋值为0。 1 #include<cstdio> 2 #include<algorithm> 3 #define MAXN 100010 4 #define INF 0x7FFFFFFF 5 using namespace std; 6 struct SpalyTree { 7 int size, root; 8 int next[MAXN][2], pre[MAXN], key[MAXN]; 9 void Init() {10 size = root = 0;11 }12 void NewNode...
阅读全文
浙公网安备 33010602011771号