萌新刚学OI,求助

P3391 【模板】文艺平衡树

xhhkwy @ 2018-09-28 13:46:57

随便乱写了一个fhq Treap

但是WA了,更震惊的是LG在线IDE的输出结果和本地不一样QwQ

求大佬帮忙,是不是我对平衡树维护区间的定义有什么误解

因为split和merge是不可能写错的

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define read(x) scanf("%d",&x);
#define write(x) printf("%d ",x);
using namespace std;
const int MAXN = 1e5 + 5;
int val[MAXN] , lc[MAXN] , rc[MAXN] , pr[MAXN] , flip[MAXN];
int cnt , root;
int m , n;
//small root heap
int newnode(int x)
{
    val[++cnt] = x;
    lc[cnt] = rc[cnt] = 0;
    pr[cnt] = rand();
    flip[cnt] = 0;
    return cnt;
} 
void down(int o)
{
    if(!flip[o])    return ;
    flip[lc[o]] ^= 1 , flip[rc[o]] ^= 1;
    swap(lc[o] , rc[o]);
    flip[o] = 0;
}
int merge(int a , int b)
{
    if(!a || !b)    return a + b;
    if(pr[a] < pr[b])
    {
        down(a);
        rc[a] = merge(rc[a] , b);
        return a;
    }
    else
    {
        down(b);
        lc[b] = merge(a , lc[b]);
        return b;
    }
}
void split(int o , int& a , int& b , int x)
{
    if(!o)  
    {
        a = b = 0;
        return ;    
    }
    if(val[o] <= x)
    {
        down(o);
        a = o;
        split(rc[o] , rc[o] , b , x);
    }
    else
    {
        down(o);
        b = o;
        split(lc[o] , a , lc[o] , x);
    }
}
void insert(int x)
{
    int a , b;
    split(root , a , b , x);
    root = merge(merge(a , newnode(x)) , b);
}
void init(int n)
{
    for(int i = 1 ; i <= n ; ++i)   insert(i);
} 
void fl(int l ,int r)
{
    int a , b , c;
    split(root , a , b , l - 1);
    split(b , b , c , r);
    flip[b] ^= 1;
    root = merge(merge(a , b) , c);
    return ;
}
void print(int o)
{
    if(!o)  return ;
    down(o);
    print(lc[o]);
    write(val[o]);
    print(rc[o]);
}
int main()
{
    read(n); read(m);
    init(n);
    while(m--)
    {
        int l , r;
        read(l); read(r);
        fl(l , r);
    }
    print(root);
    return 0;
} 

by xhhkwy @ 2018-09-28 13:47:29

我的思路是用平衡树维护编号然后打个标记随便乱搞,不知道哪里出错了QAQ


by 夜刀神十香ღ @ 2018-09-28 13:48:48

刚学OI都是怪物系列


by milk_candy @ 2018-09-28 13:54:46

刚学oi………………


by xhhkwy @ 2018-09-28 13:58:26

LZ发现自己好像少down了一个地方,但是找不到在哪QwQ


by xhhkwy @ 2018-09-28 14:11:28

Orz原来写区间旋转的时候不能用Split_By_Val啊,长知识啦

此贴终


by 外太空 @ 2018-09-28 14:11:58

刚学OI都是妖怪


by hpbl @ 2018-10-03 17:32:49

刚学OI的萌新都是怪物


|