• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

llwwll

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

邻值查找

邻值查找
给定一个长度为 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]);
	}
} 

posted on 2022-09-14 13:43  llwwll  阅读(105)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3