裸的平衡树题,splay做的。。。
存下板子
#include#include #include #define INF 0x3f3f3f3fusing namespace std;int n,tot,rt,ans;int v[100005];struct node{ int son[2]; int fa; int val;}tr[100005];void rotate(int x){ int y=tr[x].fa,z=tr[y].fa; int typ=(x==tr[y].son[1]); tr[y].son[typ]=tr[x].son[typ^1]; tr[tr[x].son[typ^1]].fa=y; tr[x].son[typ^1]=y;tr[y].fa=x; tr[x].fa=z; if(z){ if(tr[z].son[1]==y)tr[z].son[1]=x; else tr[z].son[0]=x; }}void splay(int x){ for(int y;y=tr[x].fa;rotate(x)){ if(tr[y].fa){ rotate((x==tr[y].son[0])==(y==tr[tr[y].fa].son[0])?y:x); } } rt=x;}void insert(int x,int y){ int k; while(true){ k=tr[x].son[tr[x].val =2)ans+=min(v[i]-find_pre(v[i]),find_suc(v[i])-v[i]); } printf("%d\n",ans); return 0;}