RT……
甚至都改成题解的样子了,还是 WA 10 pts……
# include <bits/stdc++.h>
# define int long long
# define up(i, x, y) for (int i = x ; i <= y; i ++)
# define dn(i, x, y) for (int i = x ; i >= y ;i --)
# define inf 1e18
using namespace std;
inline int read(){int s = 0, w = 0;char c = getchar();while(!isdigit(c)){w |= (c == '-');c = getchar();}while(isdigit(c)){s = (s << 1) + (s << 3) + (c ^ 48);c = getchar();}return w ? -s : s;}
inline void write(int x){if(x < 0) putchar('-'), x = -x;if(x > 9) write(x / 10);putchar(x % 10 | 48);}
inline void writesp(int x){write(x), putchar(' ');}
inline void writeln(int x){write(x), putchar('\n');}
const int N = 1005;
int n ,m ,g[N] ,q[N << 2] ,fruit[N][N] ,f[N][N] ,dis[N];
inline int X (int i){
return i;
} inline int Y (int i){
return -f[g[i]][i] + dis[i] + i * i;
} signed main() {
n = read () ,m = read ();
up (i ,1 ,n) {
int x = read () ,y = read ();
fruit[x][y] = read ();
}
memset (f ,-0x3f ,sizeof f);
f[1][1] = fruit[1][1] ,g[1] = 1 ,fruit[1][1] = 0;
up (i ,1 ,m) {
q[0] = 0;
int head = 1 ,tail = 0;
up (j ,1 ,m)
if (g[j]) dis[j] = (i - g[j]) * (i - g[j]);
else dis[j] = 0;
up (j ,1 ,m) {
if (g[j]) {
while (head < tail && (Y(j) - Y(q[tail])) * (X(q[tail]) - X(q[tail - 1])) <= (X(j) - X(q[tail])) * (Y(q[tail]) - Y(q[tail - 1]))) -- tail;
q[++ tail] = j;
} if (!fruit[i][j]) continue;
while (head < tail && Y(q[head + 1]) - Y(q[head]) <= (X(q[head + 1]) - X(q[head])) * 2 * j) ++ head;
g[j] = i;
int k = q[head];
f[i][j] = f[g[k]][k] - (i - g[k]) * (i - g[k]) - j * j + 2 * j * k - k * k + fruit[i][j];
while (head < tail && (Y(j) - Y(q[tail])) * (X(q[tail]) - X(q[tail - 1])) <= (X(j) - X(q[tail])) * (Y(q[tail]) - Y(q[tail - 1]))) -- tail;
q[++ tail] = j;
}
} writeln (f[m][m]);
return 0;
}