其他分享
首页 > 其他分享> > 邻值查找

邻值查找

作者:互联网

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


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

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

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

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

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

分别表示当 i取 2∼n 时,对应的 min1≤j<i∣Ai−Aj∣和 Pi的值。

数据范围
n≤10^5,∣Ai∣≤10^9 
输入样例:
3
1 5 3
输出样例:
4 1
2 1

分析 就是一个STL找前驱后继,比大小 就当练STL 有个小G巧 --s.lower_bound (x) 返回一个小于等于x的迭代器 然后就没有然后了
#define maxn 100010
#define int long long
using namespace std;
int val;

struct node{int val,id;}re[maxn];
set<node>s;
bool operator <(node a,node b) {return a.val<b.val;}
bool operator >(node a,node b) {return a.val>b.val;}
int n;
signed main()
{
	scanf("%lld",&n);
	scanf("%lld",&val); re[1].val=val,re[1].id=1;
	s.insert(re[1]);
	for(int i=2,Val,cha,pos=0;i<=n;i++) 
	{
		scanf("%lld",&Val);
		cha=1e18;
		re[i].val=Val;re[i].id=i;
//		cout<<i<<" "<<(*s.lower_bound(re[i]) ).val<<" "<<(*s.lower_bound(re[i]) ).id<<"   XXX  "<<(* -- s.lower_bound(re[i])).val<<" "<<(* -- s.lower_bound(re[i])).id<<endl<<endl;
		if(s.lower_bound(re[i])!=s.end())
		{
			
			cha=abs((*s.lower_bound(re[i])).val-Val);
			pos=(*s.lower_bound(re[i])).id;
//			cout<<"BIG  "<<i<<" "<<cha<<" "<<(*s.lower_bound(re[i])).val<<" "<<pos<<endl;
		}
		if (--s.lower_bound(re[i])!=s.end()&&abs(Val-(* -- s.lower_bound(re[i])).val )<=cha)
        {
            pos= (*--s.lower_bound(re[i])).id;
            cha=abs(Val-(*--s.lower_bound(re[i])).val);
//            cout<<"BABY "<<i<<" "<<cha<<" "<<pos<<endl;
        }
        printf ("%lld %lld\n",cha,pos);
        s.insert(re[i]);
	}
}

标签:node,输出,val,int,邻值,re,查找,输入
来源: https://www.cnblogs.com/llwwll/p/16692761.html