萌新装gedit3分钟,求助
查看原帖
萌新装gedit3分钟,求助
449230
JYFHYX楼主2021/7/12 20:21
void insert(int p)
{
	int x,y;
	split(root,p,x,y);
	++tot;
	a[tot].mx=a[tot].v=a[x].mx+1;
	a[tot].dat=rand();
	a[tot].size=1;
	root=merge(merge(x,tot),y);
}

insert这么写能a,

void insert(int p)
{
	int x,y;
	split(root,p,x,y);
	a[++tot].mx=a[tot].v=a[x].mx+1;
	a[tot].dat=rand();
	a[tot].size=1;
	root=merge(merge(x,tot),y);
}

这么写就是wa,非常玄学 AC

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{	
		if(ch=='-')
		f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
const int maxn=3e5+5;
int n,k,root,tot;
struct treap{
	int l,r,size,val,mx,dat,v;
}a[maxn];
inline int abs(int x){return x<0?-x:x;}
inline void swap(int &x,int &y){x^=y^=x^=y;}
inline int gcd(int x,int y){return y?x:gcd(y,x%y);}
inline int lcm(int x,int y){return x/gcd(x,y)*y;}
void pushup(int u)
{
	a[u].size=a[a[u].l].size+a[a[u].r].size+1;
	a[u].mx=max(max(a[a[u].l].mx,a[a[u].r].mx),a[u].v);
}
inline int merge(int x,int y)
{
	if(!x||!y)
	return x|y;
	if(a[x].dat<=a[y].dat)
	{
		a[x].r=merge(a[x].r,y);
		pushup(x);
		return x;
	}
	else
	{
		a[y].l=merge(x,a[y].l);
		pushup(y);
		return y;
	}
}
void split(int now,int k,int &x,int &y)
{
	if(!now)
	{
		x=y=0;
		return ;
	}
	if(k>a[a[now].l].size)
	x=now,split(a[now].r,k-a[a[now].l].size-1,a[now].r,y);
	else
	y=now,split(a[now].l,k,x,a[now].l);
	pushup(now);
	return ;
}

void insert(int p)
{
	int x,y;
	split(root,p,x,y);
	++tot;
    a[tot].mx=a[tot].v=a[x].mx+1;
	a[tot].dat=rand();
	a[tot].size=1;
	root=merge(merge(x,tot),y);
}
int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		int p=read();
		insert(p);
		printf("%d\n",a[root].mx);
	}
}
2021/7/12 20:21
加载中...