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
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的萌新都是怪物