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);
}
}