您的位置:首页 > 其它

BZOJ 3223 文艺平衡树 splay

2016-01-08 13:45 337 查看
在czl大神的帮助下,这splay的第一题终于搞定了,好像也不难了,是我太弱了,要加油。相信自己。也不难。

记住,翻转标记应该是bool的,不是int型的,开int会比较耗时(不过为什么结构体版的比数组快呢?是我打残了?)

#include<cstdio>
#include<iostream>
#define rep(i,j,k) for(int i = j; i <= k; i++)
#define lc c[k][0]
#define rc c[k][1]
using namespace std;
const int maxn = 100233;

int c[maxn][2], pa[maxn], s[maxn], root;
bool rev[maxn];

int read()
{
int s = 0, t = 1; char c = getchar();
while( !isdigit(c) ){
if( c == '-' )t = -1; c = getchar();
}
while( isdigit(c) ){
s = s * 10 + c - '0'; c = getchar();
}
return s * t;
}

void maintain(int k)
{
s[k] = s[lc] + s[rc] + 1;
}

void build(int l,int r,int pre)
{
if( l > r ) return;
int mid = (l+r)>>1;
pa[mid] = pre;
if( mid < pre ) c[pre][0] = mid;
else c[pre][1] = mid;
if( l < r ){
build(l,mid-1,mid); build(mid+1,r,mid);
maintain(mid);
} else s[mid] = 1;
}

void pushdown(int k)
{
if( rev[k] ){
rev[lc] ^= 1, rev[rc] ^= 1;
swap(lc,rc);
rev[k] ^= 1;
}
}

void rorate(int k,int &root)
{
int fa = pa[k], gfa = pa[fa];
int l = c[fa][1] == k, r = l ^ 1;
if( fa != root ){
c[gfa][c[gfa][1] == fa] = k;
} else root = k;
pa[fa] = k, pa[k] = gfa, pa[c[k][r]] = fa;
c[fa][l] = c[k][r]; c[k][r] = fa;
maintain(fa), maintain(k);
}

void splay(int k,int &root)
{
while( k != root ){
int fa = pa[k], gfa = pa[fa];
if( fa != root ){
if( c[fa][0] == k ^ c[gfa][0] == fa ) rorate(k,root);
else rorate(fa,root);
}
rorate(k,root);
}
}

int rank(int x,int k)
{
if( rev[k] ) pushdown(k);
if( s[lc] >= x ) return rank(x,lc);
else if( s[lc] + 1 < x ) return rank(x-s[lc]-1,rc);
else return k;
}

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

int times = 0;
int n, m;
void out(int k)
{
if( rev[k] ) pushdown(k);
if( lc ) out(lc);
if( k != n+2 && k != 1 )
printf("%d ", k-1);
if( rc) out(rc);
}

int main()
{
n = read(), m = read();
build(1,n+2,0); root = (3+n)>>1;
rep(i,1,m){
int l = read(), r = read();
rever(l,r);
}
out(root);
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: