ac代码
#include<bits\stdc++.h>
using namespace std;
typedef long long ll;
const int N =2e5+10;
ll p[N];
int num[N];
int n,m;
void fuck(int l,int r,int w)
{
p[l]+=w;
p[r+1]-=w;
}
int main()
{
cin>>n>>m;
for(int i=0;i<m;i++)
cin>>num[i];
for(int i=0;i<m-1;i++)
{
if(num[i]==num[i+1])
continue;
else
{
int minx=min(num[i],num[i+1]);
int maxx=max(num[i],num[i+1]);
fuck(minx, minx,maxx - 1);
fuck(maxx, maxx, minx);
fuck(minx + 1, maxx - 1, maxx - minx - 1);
fuck(1, minx - 1, maxx - minx);
fuck(maxx + 1, n, maxx - minx);
}
}
for(int i=1;i<=n;i++)
{
p[i]+=p[i-1];
cout<<p[i]<<" ";
}
cout<<endl;
return 0;
}
难点:每次两个数据对总体的影响
假设两个数据最小值为l,最大值为r
1.移动的数据在l的左边,那么对于l之前的数据来说,移动不会产生影响,每一组增加r-l
2.移动的数据为l,增加的值为r-1
3.在l和r之间,相当于拉近了l与r的距离,增加r-l-1
4.移动的是r,增加为l
5.移动的在r的右边,移动不产生影响,增加为r-l
如果用差分方法来做
最后输出i项实际上是前i项的和
举个例子
比如n为5 初始为 1 2 3 4 5
我们需要做的是算出每一组 5的位置与2的位置
结果
1 2 3 4 5 3
2 1 3 4 5 4
3 1 2 4 5 2
4 1 2 3 5 2
5 1 2 3 4 2
差分每一步的运行结果
0 3 -3 0 0 0 0 i<2
0 3 1 -4 0 0 0 i=2
0 3 1 -2 -2 0 0 i=3
0 3 1 -2 0 -2 0 i=4
0 3 1 -2 0 0 -2 i=5
那么输出的就是
3 4 2 2 2