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

来源:互联网 发布:java特种兵 编辑:程序博客网 时间:2024/03/29 06:00

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

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

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

set果题

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

#include<iostream>#include<cstdio>#include<set>#include<cstring>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

2 0
原创粉丝点击