邻值查找
作者:互联网
邻值查找
给定一个长度为 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
#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