洛谷 https://www.luogu.org/problem/show?pid=T574

输入格式:
第一行一个正整数N

第二行用空格隔开N个整数Ai

输出格式:
输出N行,第i行表示Ai与A1~A(i-1)中的数的最小差(绝对值),第一行输出-1

set果题

命名:qm==前面,hm==后面,xz==现在

#include
#include
#include
#include
using namespace std;
const int inf=99999999;
set<int>s;
set<int>::iterator it;
set<int>::iterator ite;
int n,a[200005],cz[200005];
int qm=0,hm=0,xz=0,tot=0,sum=0;
int main()
{
    memset(cz,inf,sizeof(cz));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }
    s.insert(a[1]);
    cz[1]=-1;
    for(int i=2;i<=n;i++)
    {
        it=s.find(a[i]);
        if(it!=s.end())
        {
            cz[i]=0;
            continue;
        }
        s.insert(a[i]);
        it=s.find(a[i]);
        xz=*it;
        ite=it;
        if(it==s.begin())
        {
            ite++;
            hm=*ite;
            tot=hm-xz;
            if(tot<0)
            tot=-tot;
            cz[i]=tot;
            continue;
        }
        else if(it!=s.begin())
        {
            ite--;
            qm=*ite;
            tot=qm-xz;
            if(tot<0)
            tot=-tot;
        }
        ite=it;
        ite++;
        if(ite!=s.end())
        {
            hm=*ite;
            sum=hm-xz;
            if(sum<0)
            sum=-sum;
        }
        else
        {
            cz[i]=tot;
            continue;
        }
        if(tot>sum)
        tot=sum;
        cz[i]=tot;
        tot=inf;
        sum=inf;
        hm=inf;
        qm=inf;
    }
    for(int i=1;i<=n;i++)
    printf("%d\n",cz[i]);
    return 0;
}

%%%sys

你可能感兴趣的:(STL)