CH1301 邻值查找set应用

Posted wyboooo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CH1301 邻值查找set应用相关的知识,希望对你有一定的参考价值。

1301 邻值查找 0x10「基本数据结构」例题

描述

给定一个长度为 n 的序列 A,A 中的数各不相同。对于 A 中的每一个数 A_i,求:
min(1≤j<i) ?|A_i-A_j|
以及令上式取到最小值的 j(记为 P_i)。若最小值点不唯一,则选择使 A_j 较小的那个

输入格式

第一行一个整数n,第二行n个数A_1~A_n。

输出格式

n-1行,每行2个用空格隔开的整数。分别表示当i取2~n时,对应的 min(1≤j<i) ?|A_i-A_j| 和 P_i 的值。

样例输入

3
1 5 3

样例输出

4 1
2 1

数据范围与约定

  • 对于30%的数据: n<=100
  • 对于70%的数据: n<=10^4
  • 对于100%的数据: n<=10^5, |A_i|<=10^9

 

思路:

用set或者是链表实现

读入第i个时,加入set,set中存的就是i之前的所有数,而且set是默认排好序的。

然后find找到i的位置,|Aj-Ai|最小的一定是Ai的前驱或者后继。

判断一下就行了。要注意Ai就是set的头或尾的情况。

奇怪的是,用printf输出的时候有一点问题不知道是为什么,用cout就行。

 1 // ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
 2 //
 3 
 4 
 5 //#include "pch.h"
 6 #include <iostream>
 7 #include <set>
 8 #include <cmath>
 9 #include <stdio.h>
10 using namespace std;
11 
12 int n;
13 const int maxn = 1e5 + 5;
14 struct node {
15     int a;
16     int id;
17     bool operator < (const node &b)const {
18         return a < b.a;
19     }
20 }A[maxn];
21 set<node>sss;
22 set<node>::iterator after;
23 set<node>::iterator before;
24 
25 int main()
26 {
27     scanf("%d", &n);
28     scanf("%d", &A[1].a);A[1].id = 1;
29     sss.clear();
30     sss.insert(A[1]);
31     for (int i = 2; i <= n; i++) {
32         scanf("%d", &A[i].a);
33         A[i].id = i;
34         sss.insert(A[i]);
35         after = sss.find(A[i]);
36         before = sss.find(A[i]);
37         //cout<<(*after).id<<endl;
38         if (after == sss.begin()) {
39             after++;
40             cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
41             //printf("%d %d
", abs((*after).a - A[i].a), (*after).id);
42         }
43         else if (after++, after == sss.end()) {
44             before--;
45             //node tmp = *before;
46             //printf("%d
", tmp.a);
47             cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
48             //printf("%d %d
", abs((*before).a - A[i].a), (*before).id);
49         }
50         else {
51             before--;
52             if (abs((*before).a - A[i].a) < abs((*after).a - A[i].a)) {
53                 cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
54             }
55             else if(abs((*before).a - A[i].a) > abs((*after).a - A[i].a)){
56                 cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
57             }
58             else {
59                 if ((*before).a < (*after).a) {
60                     cout<<abs((*before).a - A[i].a)<<" "<<(*before).id<<endl;
61                 }
62                 else {
63                     cout<<abs((*after).a - A[i].a)<<" "<<(*after).id<<endl;
64                 }
65             }
66         }
67     }
68 }
69 

 




以上是关于CH1301 邻值查找set应用的主要内容,如果未能解决你的问题,请参考以下文章

CHOI1301 邻值查找

136. 邻值查找set lower_bound

Android:在片段内膨胀自定义视图

$Noip2012 Luogu1081$ 开车旅行(倍增优化$ DP$)

Ubuntu 上五款搜索工具:AlbertSynapseUtoolsUlauncherFSearch

从另一个活动的活动中的片段传递数据