欢迎来到endl的博客hhh☀☾☽♡♥

浏览器标题切换
把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

Acwing136. 邻值查找(《算法竞赛进阶指南》)

题目描述

给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数 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≤105,|Ai|≤109

样例

输入样例:

3
1 5 3

输出样例:

4 1
2 1


 

本题用来巩固set的用法

 

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 #define R register int
 4 #define PII pair<int,int>
 5 using namespace std;
 6 const int N=1e6+5,inf=1e12;
 7 inline int read()
 8 {
 9     char ch=getchar();int num=0;bool flag=false;
10     while(ch<'0'||ch>'9'){if(ch=='-')flag=true;ch=getchar();}
11     while(ch>='0'&&ch<='9'){num=num*10+ch-'0';ch=getchar();}
12     return flag?-num:num;
13 }
14 int n;
15 set<PII> s;
16 signed main()
17 {
18     n=read();
19     s.insert({inf,0});
20     s.insert({-inf,0});
21     for(R i=1;i<=n;i++)
22     {
23         int x=read();
24         PII u(x,i);
25         if(i>1)
26         {
27             auto t1=s.upper_bound(u);//t1->first是比x大的最小的值 
28             auto t2=t1;t2--;//t2->first是比x小的最大的值
29             int d1=x-t2->first,d2=t1->first-x;
30             if(d1<=d2)printf("%lld %lld\n",d1,t2->second);
31             else printf("%lld %lld\n",d2,t1->second);
32         }
33         s.insert(u);
34     }
35     return 0;
36 }

 

此题为NOIP2012提高组 开车旅行打基础

 

posted @ 2020-08-27 10:15  endl\n  阅读(309)  评论(0编辑  收藏  举报