一周没发题解了。

我这一周干嘛了呢?

偶尔cf(cf题解过后会补上的)   剩下全都在刷数据结构,主要对splay进行了学习

贴一份我的splay模板吧。(最近的成果)

bzoj1251

splay裸题。。

#include <bits/stdc++.h>
#define N 50010
#define INF 0x7f7f7f7f
using namespace std;

inline int ReadInt()
{
	int x = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9')
	{
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9')
	{
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}
int size, sz[N], rt, n, m, id[N], c[N][2], fa[N], rev[N], mx[N], tag[N], v[N];

inline int min(int x, int y)
{
	if(x < y) return x;
	else return y;
}

inline int max(int x, int y)
{
	if(x > y) return x;
	else return y;
}

void push_up(int k)
{
	int l = c[k][0];
	int r = c[k][1];
	mx[k] = max(max(mx[l],mx[r]), v[k]);
	sz[k] = sz[l] + sz[r] + 1;
}

void push_down(int k)
{
	int l = c[k][0];
	int r = c[k][1];
	int t = tag[k];
	if(t)
	{
		tag[k] = 0;
		if(l)
		{
			tag[l] += t;
			mx[l] += t;
			v[l] += t;
		}
		if(r)
		{
			tag[r] += t;
			mx[r] += t;
			v[r] += t;
		}
	}
	if(rev[k])
	{
		rev[k] = 0;
		rev[l] ^= 1;
		rev[r] ^= 1;
		swap(c[k][0],c[k][1]);
	}
}

void rorate(int x, int &k)
{
	int y = fa[x], z = fa[y], l, r;
	if(c[y][0] == x) l = 0;
	else l = 1;
	r = l ^ 1;
	if(y == k) k = x;
	else
	{
		if(c[z][0] == y) c[z][0] = x;
		else c[z][1] = x;
	}
	fa[x] = z;
	fa[y] = x;
	fa[c[x][r]] = y;
	c[y][l] = c[x][r];
	c[x][r] = y;
	push_up(y);
	push_up(x);
}

void splay(int x, int &k)
{
	while(x != k)
	{
		int y = fa[x];
		int z = fa[y];
		if(y != k)
			if(c[y][0] == x ^ c[z][0] == y) rorate(x, k);
			else rorate(y, k);
		rorate(x, k);
	}
}

int find(int x, int rank)
{
	if(tag[x] || rev[x]) push_down(x);
	int l = c[x][0];
	int r = c[x][1];
	if(sz[l] + 1 == rank) return x;
	else if(sz[l] >= rank) return find(l, rank);
	else return find(r, rank - sz[l] - 1);
}

void build(int l, int r, int f)
{
	if(l > r) return;
	int now = id[l], last = id[f];
	if(l == r)
	{
		fa[now] = last;
		sz[now] = 1;
		if(l < f) c[last][0] = now;
		else c[last][1] = now;
		return;
	}
	int mid = (l + r) >> 1;
	now = id[mid];
	build(l, mid - 1, mid);
	build(mid + 1, r, mid);
	fa[now] = last;
	push_up(now);
	if(mid < f) c[last][0] = now;
	else c[last][1] = now;
}

void rever(int l, int r)
{
	int x = find(rt, l);
	int y = find(rt, r + 2);
	splay(x, rt);
	splay(y, c[x][1]);
	int z = c[y][0];
	rev[z] ^= 1;
}

void query(int l, int r)
{
	int x = find(rt, l);
	int y = find(rt, r + 2);
	splay(x, rt);
	splay(y, c[x][1]);
	int z = c[y][0];
	printf("%d\n", mx[z]);
}

void update(int l, int r, int val)
{
	int x = find(rt, l);
	int y = find(rt, r + 2);
	splay(x, rt);
	splay(y, c[x][1]);
	int z = c[y][0];
	tag[z] += val;
	v[z] += val;
	mx[z] += val;
}

int main()
{
	mx[0] = -INF;
	n = ReadInt();
	m = ReadInt();
	for(int i = 1; i <= n + 2; i ++)
		id[i] = ++ size;
	build(1, n + 2, 0);
	rt = (n + 3) >> 1;
	for(int i = 1; i <= m; i ++)
	{
		int f = ReadInt(), l, r, val;
		switch(f)
		{
			case 1:l = ReadInt();r = ReadInt();val = ReadInt();update(l,r,val);break;
			case 2:l = ReadInt();r = ReadInt();rever(l,r);break;
			case 3:l = ReadInt();r = ReadInt();query(l,r);break;
		}
	}
	return 0;
}