136. 邻值查找

136. 邻值查找,第1张

给定一个长度为 n 的序列 A,A 中的数各不相同。

对于 A 中的每一个数 Ai,求:

min1≤j 以及令上式取到最小值的 j(记为 Pi)。若最小值点不唯一,则选择使 Aj 较小的那个。

输入格式
第一行输入整数 n,代表序列长度。

第二行输入 n 个整数A1…An,代表序列的具体数值,数值之间用空格隔开。

输出格式
输出共 n−1 行,每行输出两个整数,数值之间用空格隔开。

分别表示当 i 取 2∼n 时,对应的 min1≤j

#include
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=1e5+10;
typedef  pairPII;
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<

双链表,升序排序,查找其前驱后继,

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/756362.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-30
下一篇2022-04-30

发表评论

登录后才能评论

评论列表(0条)