果然就是平衡树,直接建立平衡树然后判断,期间被提示使用非法函数好多次,结果居然是不允许使用srand(),无语
程序代码:
#include <iostream>
#include <ctime>
#include <cstdlib>
#define MAX 10010
using namespace std;
typedef struct
{
int l,r,key,fix;
}node;
class treap
{
public:
node p[MAX];
int size,root;
void newT()
{
// srand(time(0));
size=-1;
root=-1;
for (int i=0; i<MAX; i++)
p[i].l=p[i].r=p[i].key=p[i].fix=0;
}
void rot_l(int &x)
{
int y=p[x].r;
p[x].r=p[y].l;
p[y].l=x;
x=y;
}
void rot_r(int &x)
{
int y=p[x].l;
p[x].l=p[y].r;
p[y].r=x;
x=y;
}
void insert(int &k,int tkey)
{
if (k==-1)
{
k=++size;
p[k].l=p[k].r=-1;
p[k].key=tkey;
p[k].fix=rand();
}
else
if (tkey<p[k].key)
{
insert(p[k].l,tkey);
if (p[ p[k].l ].fix>p[k].fix)
rot_r(k);
}
else
{
insert(p[k].r,tkey);
if (p[ p[k].r ].fix>p[k].fix)
rot_l(k);
}
}
int find(int x,int tkey)
{
int now=1000000;
while (x!=-1)
{
now=min(now,abs(tkey-p[x].key));
if (now==0) break;
if (p[x].key>tkey) x=p[x].l; else x=p[x].r;
}
return now;
}
};
treap T;
int main()
{
int p,n,ans,j;
cin>>p;
while (p--)
{
cin>>n;
ans=0;
T.newT();
cin>>j; T.insert(T.root,j);
for (int i=2; i<=n; i++)
{
cin>>j;
ans+=T.find(T.root,j);
T.insert(T.root,j);
}
cout<<ans<<endl;
}
return 0;
}