邻值查找[链表例题] | ||
|
问题描述
给定一个长度为 的序列 , 中的数各不相同。对于 中的每一个数 ,求: 以及令上式取到最小值的 (记为 )。若最小值点不唯一,则选择使 较小的那个。
输入格式
第一行一个整数,第二行个数。
输出格式
行,每行个用空格隔开的整数。分别表示当取~时,对应的 和 的值
样例输入
3
1 5 3
样例输出
4 1
2 1
链表 也很考验写代码的能力
#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,int> yi;
const int N=100010;
yi a[N],myAns[N];
int q[N],l[N],r[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i].first);
a[i].second=i;
}
//排序
sort(a+1,a+1+n);
a[0].first=1e9+1,a[n+1].first=-1e9-1;
for(int i=1;i<=n;i++){
l[i]=i-1;r[i]=i+1;//左边与右边
q[a[i].second]=i;//记下当前的下标
}
//计算
for(int i=n;i>=2;i--){
int j=q[i],myLeft=l[j],myRight=r[j];
int lv1=abs(a[j].first-a[myLeft].first);
int rv1=abs(a[j].first-a[myRight].first);
if(lv1<=rv1){
yi tmp;
tmp.first=lv1;
tmp.second=a[myLeft].second;
myAns[i]=tmp;
}else{
yi tmp;
tmp.first=rv1;
tmp.second=a[myRight].second;
myAns[i]=tmp;
}
l[myRight]=myLeft,r[myLeft]=myRight;
}
//输出即可
for(int i=2;i<=n;i++){
cout<<myAns[i].first<<" "<<myAns[i].second<<endl;
}
}