标签: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提高组 开车旅行打基础
标签:lin 长度 fine printf char 提高 span color code
原文地址:https://www.cnblogs.com/ljy-endl/p/13569871.html