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

LINK

//差分+思维 E. Special Permutations Codeforces Round #590 (Div. 3)_第1张图片
//差分+思维 E. Special Permutations Codeforces Round #590 (Div. 3)_第2张图片//差分+思维 E. Special Permutations Codeforces Round #590 (Div. 3)_第3张图片想了两天

  • 解释见注释
#include
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]);
	}
}

你可能感兴趣的:(codeforce,思维)