列表

详情


NC50972. 邻值查找

描述

给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数A_i,求:
以及令上式取到最小值的 j(记为 P_i)。若最小值点不唯一,则选择使 A_j较小的那个。

输入描述

第一行一个整数n,第二行n个数

输出描述

n-1行,每行2个用空格隔开的整数。分别表示当i取2~n时,对应的 P_i 的值。

示例1

输入:

3
1 5 3

输出:

4 1
2 1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3 解法, 执行用时: 1331ms, 内存消耗: 21504K, 提交时间: 2023-07-22 15:37:24

from bisect import bisect_left
n=int(input())
arr=list(map(int,input().split()))
sortlist=[arr[0]]
dic={}
for i,it in enumerate(arr): dic[it]=i 
res=[]
for it in arr[1:]:
    ind=bisect_left(sortlist, it)
    sortlist.insert(ind, it)
    if ind==0:
        print(abs(it-sortlist[1]),dic[sortlist[1]]+1)
    elif ind==len(sortlist)-1:
        print(abs(it-sortlist[-2]),dic[sortlist[-2]]+1)
    else:
        if abs(it-sortlist[ind-1])<=abs(it-sortlist[ind+1]):
            print(abs(it-sortlist[ind-1]),dic[sortlist[ind-1]]+1)
        else:
            print(abs(it-sortlist[ind+1]),dic[sortlist[ind+1]]+1)
         

C++(g++ 7.5.0) 解法, 执行用时: 60ms, 内存消耗: 8484K, 提交时间: 2023-07-26 15:35:38

#include<bits/stdc++.h>
using namespace std;
long long a[1000001];
set<pair<long long,long long> >st;
int main(){
	long long n,ans1,ans2;scanf("%lld",&n);
	for(register int i=1;i<=n;++i){
		scanf("%lld",&a[i]);ans1=1e18;
		if(i==1)st.insert(make_pair(a[i],i));
		else{
			st.insert(make_pair(a[i],i));
			set<pair<long long,long long> >::iterator it=st.lower_bound(make_pair(a[i],i));
			if(++it!=st.end())ans1=it->first-a[i],ans2=it->second;
			--it;
			if(it--!=st.begin()&&ans1>=a[i]-it->first)ans1=a[i]-it->first,ans2=it->second;
			printf("%lld %lld\n",ans1,ans2);
		}
	}
}

C++ 解法, 执行用时: 188ms, 内存消耗: 7668K, 提交时间: 2021-09-01 21:06:44

#include "bits/stdc++.h"
using namespace std;
set<pair<long long,int>> q;
long long a,n;
int main()
{
	q.insert({-9999999999999999,-1});
    q.insert({9999999999999999,-1});
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a;
		if(i!=1)
		{
			auto j=q.upper_bound({a,i});
			auto jj=j--;
			if(a-j->first<=jj->first-a) cout<<a-j->first<<' '<<j->second<<endl;
			else cout<<jj->first-a<<' '<<jj->second<<endl; 
		}
		q.insert({a,i});
	}
}

上一题