2 条题解
-
0
#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
#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
- 上传者