//差分+思维 E. Special Permutations Codeforces Round #590 (Div. 3)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43880084/article/details/102104793

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]);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43880084/article/details/102104793