这么好玩的数据结构题肯定是要来做一做啦
考虑splay-
显然用一个节点去维护一个连续的内存块,每次申请内存就找一块尽可能前的,释放就找一个有相交的并合并,没有则新建节点
splay一打还是错落百出,不过效率还是可以的,跑了第一和map一样快
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 100010
#define son(x) (s[f[x]][1]==x)
using namespace std;
int f[N],s[N][2],sz[N],v[N],l[N],t[N];
int n,m,cnt=0,rt=0;
inline int newnode(int p,int len){
++cnt; sz[cnt]=1;
v[cnt]=p; l[cnt]=t[cnt]=len;
return cnt;
}
inline int ps(int x){
sz[x]=sz[s[x][0]]+sz[s[x][1]]+1;
t[x]=max(l[x],max(t[s[x][0]],t[s[x][1]]));
}
inline void rot(int x){
int p=f[x],g=f[p],d