版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
LINK
想了两天
- 解释见注释
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll s[N],x[N];
void up(int l,int r,int v)//是差分
{
s[l]+=v;
s[r+1]-=v;
}
int main()
{
int n,m;scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d",&x[i]);
for(int i=2;i<=m;i++)
{
int l,r;l=x[i-1],r=x[i];
if(l>r) swap(l,r);
if(l!=r)
{
up(1,l-1,r-l);//假设提前的是1~l-1范围的数那么(l,r)的贡献还是(r-l)
up(r+1,n,r-l);//同上提前的是(r+1~n)也是一样的
up(l+1,r-1,r-l-1);
//假设提前的是(l+1~r-1)范围中的数那么就相当于拉近r与l的距离所以(l,r)的贡献就是就是 r-l-1
up(l,l,r-1);//提前的是l端点(l,r)的贡献就是r-1 就像--12345-(3,5)->31245->5-1=r-1;
up(r,r,l); // 提前的是r点 (l,r)的贡献就是l 就像--12345-(3,5)->51234->3=l;
}
}
for(int i=1;i<=n;i++)
{
printf("%I64d ",s[i]+=s[i-1]);
}
}