CHOI1301 邻值查找

那个写平衡树是不可能写平衡树,这辈子都不可能写平衡树。只有链表才能维持的了生命。

#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;
}
View Code
原文地址:https://www.cnblogs.com/Dream-Runner/p/10155571.html