给定一个长度为 n 的序列 A,A 中的数各不相同。
对于 A 中的每一个数 Ai,求:
min1≤j<i|Ai−Aj|
以及令上式取到最小值的 j(记为 Pi)。若最小值点不唯一,则选择使 Aj 较小的那个。
输入格式
第一行输入整数 n,代表序列长度。
第二行输入 n 个整数A1…An,代表序列的具体数值,数值之间用空格隔开。
输出格式
输出共 n−1 行,每行输出两个整数,数值之间用空格隔开。
分别表示当 i 取 2∼n 时,对应的 min1≤j<i|Ai−Aj| 和 Pi 的值。
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=1e5+10;
typedef pair<ll,int>PII;
PII a[N],ans[N];
int l[N],r[N],p[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].first;
a[i].second=i;
}
sort(a+1,a+1+n);
a[0].first=INF;
a[n+1].first=-INF;
for(int i=1;i<=n;i++)
{
l[i]=i-1;
r[i]=i+1;
p[a[i].second]=i;
}
for(int i=n;i>1;i--)
{
int pos=p[i],left=l[pos],right=r[pos];
ll lv=abs(a[pos].first-a[left].first);
ll rv=abs(a[right].first-a[pos].first);
if(lv<=rv)
ans[i].first=lv,ans[i].second=a[left].second;
else
ans[i].first=rv,ans[i].second=a[right].second;
l[right]=left;
r[left]=right;
}
for(int i=2;i<=n;i++)
cout<<ans[i].first<<' '<<ans[i].second<<endl;
return 0;
}
双链表,升序排序,查找其前驱后继,