2 条题解

  • 0
    @ 2025-10-8 16:56:01
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=110000;
    struct node
    {
    	LL x;int p;
    }a[N],ans[N];
    bool cmp(node n1,node n2) { if(n1.x!=n2.x)return  n1.x<n2.x; return  n1.p<n2.p ;}
    int l[N],r[N],P[N];
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%lld",&a[i].x);
            a[i].p=i;
        }
        sort(a+1,a+n+1,cmp);
        a[0].x=-(LL)1<<60;a[n+1].x=(LL)1<<60;
        for(int i=1;i<=n;i++)
        {
            l[i]=i-1;r[i]=i+1;
            P[ a[i].p ]=i;
        }
        for(int i=n;i>1;i--) 
        {
            int j=P[i],left=l[j],right=r[j];
            LL lv=abs(a[j].x -  a[left].x);
            LL rv=abs(a[j].x - a[right].x);
            if(lv<=rv)ans[i]={lv,a[left].p};
            else      ans[i]={rv,a[right].p};
            l[right]=left;r[left]=right;
        }
        for(int i=2;i<=n;i++)printf("%lld %d\n",ans[i].x,ans[i].p);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:55:50
      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      const int N=110000;
      struct node
      {
      	LL x;int p;
      }a[N],ans[N];
      bool cmp(node n1,node n2) { if(n1.x!=n2.x)return  n1.x<n2.x; return  n1.p<n2.p ;}
      int l[N],r[N],P[N];
      int main()
      {
          int n;scanf("%d",&n);
          for(int i=1;i<=n;i++)
          {
              scanf("%lld",&a[i].x);
              a[i].p=i;
          }
          sort(a+1,a+n+1,cmp);
          a[0].x=-(LL)1<<60;a[n+1].x=(LL)1<<60;
          for(int i=1;i<=n;i++)
          {
              l[i]=i-1;r[i]=i+1;
              P[ a[i].p ]=i;// P[3]=7表示原来第3个输入的数排序后是第7个 
          }
          for(int i=n;i>1;i--) // i枚举的是输入的顺序,找到i的亲近数后,让i消失 
          {
              int j=P[i],left=l[j],right=r[j];
              LL lv=abs(a[j].x -  a[left].x);
              LL rv=abs(a[j].x - a[right].x);
              if(lv<=rv)ans[i]={lv,a[left].p};
              else      ans[i]={rv,a[right].p};
              l[right]=left;r[left]=right;
          }
          for(int i=2;i<=n;i++)printf("%lld %d\n",ans[i].x,ans[i].p);
          return 0;
      }


      • 1

      信息

      ID
      1275
      时间
      2000ms
      内存
      64MiB
      难度
      2
      标签
      递交数
      65
      已通过
      40
      上传者