我考虑的是先对原数组进行排序,然后最大的数字a[n]肯定是0次不可移动,然后从n-1往1去推不可移动次数 那么对于a[i]就考虑a[i+1] - a[i]和增值m的关系
如果a[i+1]-a[i] <= m,那a[i]+m肯定会影响排名,必须等a[i+1]调整完才能给a[i]+m,所以a[i]的不可移动次数 = a[i+1]的不可移动次数+1
如果a[i+1]==a[i],那么它们我是想着继承不可移动次数,但是这里的正确性没有验证
同时如果a[i + 1] - a[i] > m说明a[i]+m是不会影响排名的,那么a[i]继承a[i+1]的不可移动次数就行
但是提交只得18分,不太清楚错误的原因,求大佬指点
#include<bits/stdc++.h>
#define f(i,s,e) for(int i = s; i <= e; i++)
#define ll long long
using namespace std;
const int N = 2e5+10,inf = 0x3f3f3f3f;
struct node{
ll id,x,k;
};
node a[N];
int n,m;
bool cmp(node a,node b)
{
return a.x < b.x;
}
bool cmp2(node a,node b)
{
return a.id < b.id;
}
int main()
{
cin >> n >> m;
f(i,1,n)
{
scanf("%lld",&a[i].x);
a[i].id = i,a[i].k = 0;
}
sort(a + 1, a + 1 + n, cmp);
for(int i = n - 1; i >= 1; i--)
{
if(a[i].x == a[i + 1].x) a[i].k = a[i + 1].k; //相邻数值继承不可移动次数
else if(a[i + 1].x - a[i].x <= m) a[i].k = a[i + 1].k + 1; //相邻差小于等于m,会影响排名,所以要等a[i+1]调整完后自己才能调整
else if(a[i + 1].x - a[i].x > m) a[i].k = a[i + 1].k; //相邻差大于m,说明无额外不可移动次数,只需要等待a[i+1]移动完自己就能移动
}
sort(a + 1, a + 1 + n, cmp2); //复原输出
f(i,1,n)
cout << a[i].k << " ";
return 0;
}