那个写平衡树是不可能写平衡树,这辈子都不可能写平衡树。只有链表才能维持的了生命。
#include<bits/stdc++.h> using namespace std; const int N=1e5+5,inf=2147483647; typedef pair<int,int> P; P a[N]; int b[N],b2[N],cnt=2,head=1,tail=2,ans1[N],ans2[N]; struct edge{ int value,next,pre; }e[N]; void ins(int pos,int x){// 在pos位置后面加一个数X e[++cnt].value=x; e[cnt].next=e[pos].next; e[cnt].pre=pos; e[e[pos].next].pre=cnt; e[pos].next=cnt; } void del(int pos){ e[e[pos].next].pre=e[pos].pre; e[e[pos].pre].next=e[pos].next; } int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%d",&a[i].first),a[i].second=i; sort(a+1,a+1+n); e[head].next=tail;e[tail].pre=head; for(int i=1;i<=n;++i){ins(e[tail].pre,a[i].first);b[a[i].second]=cnt;b2[cnt]=a[i].second;} for(int i=n;i>=2;--i){ ans1[i]=inf; if(e[b[i]].next!=tail)ans1[i]=min(ans1[i],abs(e[b[i]].value-e[e[b[i]].next].value)),ans2[i]=b2[e[b[i]].next]; if(e[b[i]].pre!=head)if(ans1[i]>=abs(e[b[i]].value-e[e[b[i]].pre].value))ans1[i]=abs(e[b[i]].value-e[e[b[i]].pre].value),ans2[i]=b2[e[b[i]].pre]; del(b[i]); } for(int i=2;i<=n;++i)printf("%d %d ",ans1[i],ans2[i]); return 0; }