调不动了 WA 10pts 悬关求调。
查看原帖
调不动了 WA 10pts 悬关求调。
1296826
lcfollower楼主2025/8/1 10:55

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;
}
2025/8/1 10:55
加载中...