• 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
    ",d1,t2->second);
    31             else printf("%lld %lld
    ",d2,t1->second);
    32         }
    33         s.insert(u);
    34     }
    35     return 0;
    36 }

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

  • 相关阅读:
    BZOJ-1034-[ZJOI2008]泡泡堂BNB(贪心)
    BZOJ-2456-mode(思维题)
    POJ-2528-Mayor's posters(线段树+离散化)
    POJ-2352-Stars(树状数组)
    HDU-2688-Rotate(树状数组)
    POJ-1195-Mobile phones(二维树状数组)
    YYHS-NOIP2017Training0921-逆光
    YYHS-鏖战字符串(斜率优化)
    左偏树
    2-sat模板
  • 原文地址:https://www.cnblogs.com/ljy-endl/p/13569871.html
Copyright © 2020-2023  润新知