1
https://codeforces.com/contest/713/problem/C
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3005;
const long long INF = 1e14;
int n;
long long a[MAXN];
long long b[MAXN];
long long f[MAXN][MAXN];
long long g[MAXN][MAXN];
void solve1()
{
scanf("%d",&n);
for (int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
a[i]-=i;
b[i]=a[i];
}
sort(b+1,b+n+1);
for (int i=1; i<=n; i++) {
g[i][0]=INF;
for (int j=1; j<=n; j++) {
f[i][j]=g[i-1][j]+abs(a[i]-b[j]);
g[i][j]=min(g[i][j-1], f[i][j]);
}
}
//printf("%lld\n",g[n][n]);
puts("");
for (int i=1; i<=n; i++) printf("%3lld ",a[i]);
puts("");
for (int i=1; i<=n; i++) printf("%3lld ",b[i]);
puts("");
for (int i=1; i<=n; i++) {
printf("\n[%3d] f: ",i);
for (int j=1; j<=n; j++) printf("%3lld ",f[i][j]);
printf("\n g: ");
for (int j=1; j<=n; j++) printf("%3lld ",g[i][j]);
}
puts("");
}
void solve()
{
scanf("%d",&n);
for (int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
a[i]-=i;
}
long long ans=0;
priority_queue<int> Q;
for (int i=1; i<=n; i++) {
Q.push(a[i]);
ans+=Q.top()-a[i];
Q.pop();
Q.push(a[i]);
}
printf("%lld\n",ans);
}
int main()
{
solve();
return 0;
}
2
https://www.luogu.com.cn/problem/P3195
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 50005;
int n, L;
long long c[MAXN];
long long s[MAXN];
long long A[MAXN], B[MAXN];
long long f[MAXN];
long long Q[MAXN<<1];
int ql, qr;
long long X(int j) {return B[j];}
long long Y(int j) {return f[j]+B[j]*B[j];}
long long K(int i) {return A[i]<<1;}
long long M(int i) {return f[i]-A[i]*A[i];}
long long get_f(int i, int j)
{
return Y(j)-K(i)*X(j)+A[i]*A[i];
}
// k(p1,p2) > k(p2,p3) |: p1x < p2x < p3x
bool check_k(int p1, int p2, int p3)
{
return (Y(p2)-Y(p1))*(X(p3)-X(p2)) > (Y(p3)-Y(p2))*(X(p2)-X(p1));
}
// k(p1,p2) <= k |: p1x < p2x
bool check_k(int p1, int p2, long long k)
{
return (Y(p2)-Y(p1)) <= (X(p2)-X(p1))*k;
}
void solve()
{
scanf("%d%d",&n,&L);
for (int i=1; i<=n; i++) {
scanf("%lld",&c[i]);
s[i]=s[i-1]+c[i];
A[i]=i+s[i];
B[i]=A[i]+L+1;
}
B[0]=L+1;
ql=qr=MAXN; // Q={0}
for (int i=1; i<=n; i++) {
while (ql<qr && check_k(Q[ql], Q[ql+1], K(i)))
ql++;
f[i]=get_f(i, Q[ql]); // get the best f[i]
//f[i]=min(f[i], (i-1+s[i]-L)*(i-1+s[i]-L));
while (ql<qr && check_k(Q[qr-1], Q[qr], i))
qr--;
Q[++qr]=i; // push
}
printf("%lld\n",f[n]);
}
int main()
{
solve();
return 0;
}
/*
5 4 3 4 2 1 4
4 5 2 4 7 3
*/