标签:node 输出 val int 邻值 re 查找 输入
邻值查找
给定一个长度为 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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。