首先是数组,要开到 tr[N<<7]。
其次是 delete 函数,看看你 split 的顺序。
AC:
int x,y,z;
split(rt,k,x,y);
split(x,k-1,x,z);
rt=merge(x,y);
WA:
int x,y,z;
split(rt,k-1,x,y);
split(y,k,z,y);
rt=merge(x,y);
再次是你的 split 里的 pushdown,放在外面。
AC:
void split(int rt,int v,int &x,int &y)
{
if(rt==0) {return x=y=0,void();}
pushdown(rt);
if(tr[ls].sz<v)
{
tr[x=++tot]=tr[rt];
split(tr[x].rc,v-tr[ls].sz-1,tr[x].rc,y);
pushup(x);
}
else
{
tr[y=++tot]=tr[rt];
split(tr[y].lc,v,x,tr[y].lc);
pushup(y);
}
}
WA:
void split(int rt,int v,int &x,int &y)
{
if(rt==0) {return x=y=0,void();}
// pushdown(rt);
if(tr[ls].sz<v)
{
tr[x=++tot]=tr[rt];
pushdown(x);
split(tr[x].rc,v-tr[ls].sz-1,tr[x].rc,y);
pushup(x);
}
else
{
tr[y=++tot]=tr[rt];
pushdown(y);
split(tr[y].lc,v,x,tr[y].lc);
pushup(y);
}
}
最后是你的 merge,在 pushdown 之前要新建节点,否则下传 tag 会出问题。
AC:
int merge(int x,int y)
{
if(x==0||y==0) return x+y;
if(tr[x].pri<tr[y].pri)
{
pushdown(x);
int p=++tot;tr[p]=tr[x];
tr[p].rc=merge(tr[p].rc,y);
pushup(p);
return p;
}
else
{
pushdown(y);
int p=++tot;tr[p]=tr[y];
tr[p].lc=merge(x,tr[p].lc);
pushup(p);
return p;
}
}
WA:
int merge(int x,int y)
{
if(x==0||y==0) return x+y;
if(tr[x].pri<tr[y].pri)
{
pushdown(x);
// int p=++tot;tr[p]=tr[x];
tr[x].rc=merge(tr[x].rc,y);
pushup(x);
return x;
}
else
{
pushdown(y);
// int p=++tot;tr[p]=tr[y];
tr[y].lc=merge(x,tr[y].lc);
pushup(y);
return y;
}
}
这道题太难调了,Orz 一发过的神犇。