码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-09-04 17:28:28      阅读:52      评论:0      收藏:0      [点我收藏+]

标签:lin   长度   fine   printf   char   提高   span   color   code   

题目描述

给定一个长度为 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提高组 开车旅行打基础

 

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

标签:lin   长度   fine   printf   char   提高   span   color   code   

原文地址:https://www.cnblogs.com/ljy-endl/p/13569871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!