码迷,mamicode.com
首页 > 其他好文 > 详细

splay树模版

时间:2014-09-03 14:58:56      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:blog   io   for   2014   sp   log   html   amp   on   

 

#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int maxn = 100010;
int pre[maxn], ch[maxn][2], sz[maxn];
int root, top1;
int s[maxn], top2;//内存池 

LL sum[maxn];
int val[maxn], add[maxn], a[maxn];
void pushdown(int x)
{
    if(add[x])
    {
        val[ch[x][0]] += add[x];
        val[ch[x][1]] += add[x];
        add[ch[x][0]] += add[x];
        add[ch[x][1]] += add[x];
        sum[ch[x][0]] += (LL)sz[ch[x][0]]*add[x];
        sum[ch[x][1]] += (LL)sz[ch[x][1]]*add[x];
        add[x] = 0;
    }
}

void pushup(int x)
{
    sz[x] = sz[ch[x][0]] + sz[ch[x][1]] + 1;
    sum[x] = sum[ch[x][0]] + sum[ch[x][1]] + val[x];
}
void rotate(int x, int d)
{
    int y = pre[x];
    pushdown(y);
    pushdown(x);
    ch[y][d^1] = ch[x][d];
    pre[ch[x][d]] = y;
    if(pre[y])
        ch[pre[y]][ch[pre[y]][1] == y] = x;
    pre[x] = pre[y];
    ch[x][d] = y;
    pre[y] = x;
    pushup(y);
    
}

void Splay(int x, int goal)
{
    pushdown(x);
    while(pre[x] != goal)
    {
        if(pre[pre[x]] == goal)
        {
            rotate(x, ch[pre[x]][0] == x);
        }
        else
        {
            int y = pre[x], z = pre[y];
            int d = (ch[z][0] == y);
            if(ch[y][d] == x)
            {
                rotate(x, d^1);
                rotate(x, d);
            }
            else
            {
                rotate(y, d);
                rotate(x, d);
            }
        }
    }
    pushup(x);
    if(goal == 0)
        root = x;
}

void erase(int x)
{
    int y = pre[x];
    
}

void NewNode(int &x, int f, int c)
{
    if(top2)
        x = top2--;
    else
        x = ++top1;
    ch[x][0] = ch[x][1];
    sz[x] = 1;
    pre[x] = f;
    
    val[x] = sum[x] = c;
    add[x] = 0;
}
void build(int &x, int l, int r, int f)
{
    if(l > r)
        return;
    int m = (l + r) >> 1;
    NewNode(x, f, a[m]);
    build(ch[x][0], l, m-1, x);
    build(ch[x][1], m+1, r, x);
    pushup(x);
}
void init(int n)
{
    ch[0][0] = ch[0][1] = pre[0] = sz[0] = 0;
    add[0] = sum[0] = val[0];
    
    root = top1 = top2 = 0;
    NewNode(root, 0, -1);
    NewNode(ch[root][1], root, -1);
    sz[root] = 2;
    
    for(int i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    build(ch[ch[root][1]][0], 1, n, ch[root][1]);
    pushup(ch[root][1]);
    pushup(root);
    //printf("**%d %d\n", val[root]);
}

int kth(int x, int k)
{
	pushdown(x);
	int s = sz[ch[x][0]];
	if(k == s+1)
		return x;
	if(k <= s)
		return kth(ch[x][0], k);
	return kth(ch[x][1], k-s-1);
}

void update(int l, int r, int c)
{
	Splay(kth(root, l), 0);
	Splay(kth(root, r+2), root);
	val[ch[ch[root][1]][0]] += c;
	add[ch[ch[root][1]][0]] += c;
	sum[ch[ch[root][1]][0]] += (LL)c*sz[ch[ch[root][1]][0]];
	pushup(ch[root][1]);
	pushup(root);
}
LL query(int l, int r)
{
	Splay(kth(root, l), 0);
	Splay(kth(root, r+2), root);
	return sum[ch[ch[root][1]][0]];
}


 

splay树模版

标签:blog   io   for   2014   sp   log   html   amp   on   

原文地址:http://blog.csdn.net/u011686226/article/details/39027441

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!