There is a point in the wrong answer, ask the great God advice
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace Std;
struct SHU
{
int zhi,dui,l,r,sum1;
}A[32768];
int N,sum,root,size,ans;
void Qian (int a1,int A2)
{
if (a1==0)
Return
if (A[A1].ZHI==A2)
{
ANS=A2;
Return
}
if (A[A1].ZHI<A2)
{
Ans=a[a1].zhi;
Qian (A[A1].R,A2);
}
Else
Qian (A[A1].L,A2);
Return
}
void Hou (int a1,int A2)
{
if (a1==0)
Return
if (A[A1].ZHI==A2)
{
ANS=A2;
Return
}
if (A[A1].ZHI>A2)
{
Ans=a[a1].zhi;
Hou (A[A1].L,A2);
}
Else
Hou (A[A1].R,A2);
Return
}
void Zuo (int &a1)
{
int T=A[A1].R;
A[A1].R=A[T].L;
A[T].L=A1;
a1=t;
Return
}
void You (int &a1)
{
int t=a[a1].l;
A[A1].L=A[T].R;
A[T].R=A1;
a1=t;
Return
}
void Jia (int &a1,int A2)
{
if (a1==0)
{
size++;
A1=size;
A[A1].ZHI=A2;
A[a1].sum1=1;
A[a1].dui=rand ();
Return
}
if (A[A1].ZHI==A2)
a[a1].sum1++;
Else
if (A[A1].ZHI<A2)
{
Jia (A[A1].R,A2);
if (A[a[a1].r].dui<a[a1].dui)
Zuo (A1);
}
Else
{
Jia (A[A1].L,A2);
if (A[a[a1].l].dui<a[a1].dui)
You (A1);
}
Return
}
int main ()
{
scanf ("%d", &n);
scanf ("%d", &sum);
Jia (root,sum);
for (int i=1;i<n;i++)
{
int A1;
scanf ("%d", &a1);
int minn=0x7fffff;
Ans=-1;
Qian (ROOT,A1);
if (ans>-1)
Minn=a1-ans;
Ans=-1;
Hou (ROOT,A1);
if (ans>-1)
Minn=min (Ans-a1,minn);
Sum+=minn;
Jia (ROOT,A1);
}
printf ("%d\n", sum);
return 0;
}
Treap 1296 turnover statistics