如果你只有34pts
查看原帖
如果你只有34pts
727558
WerChange楼主2024/3/19 21:18

首先是数组,要开到 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 一发过的神犇。

2024/3/19 21:18
加载中...