题目链接:https://codeforces.com/contest/1234/problem/E
这道题按照题面逻辑考虑,不容易得出好的做法。
考虑每对x[i], x[i + 1]对各个所求值的贡献。分析发现这是一个分段的贡献,那么可以用差分前缀和的形式完成区间更新,单点查询。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
long long f[maxn];
void add(int l ,int r, int v)
{
f[l] += v, f[r+1] -= v;
}
int x[maxn];
int main()
{
int n, m;
cin >> n >> m;
for(int i = 0; i < m; ++i)cin >> x[i];
for(int i = 0; i < m - 1; ++i)
{
int l = x[i], r = x[i + 1];
if(l==r)continue;
if(l > r) swap(l, r);
add(l, l,r - 1);
add(r, r, l);
add(l + 1, r - 1, r - l - 1);
add(1, l - 1, r - l);
add(r + 1, n, r - l);
}
for(int i = 1;i <= n; ++i)
{
f[i] += f[i - 1];
printf("%lld ", f[i]);
}
return 0;
}