staticconstint N = 2000; longlong s[4000001]; int a[N][N];
longlongkadane(const vector<int>& v){ longlong best = LLONG_MIN, cur = 0; for (int x : v) { cur = max((longlong)x, cur + x); best = max(best, cur); } return best; }
// 1. 生成伪随机数 for (int k = 1; k <= 55; k++) { longlong val = 100003LL - 200003LL * k + 300007LL * k * k * k; s[k] = val % 1000000 - 500000; } for (int k = 56; k <= 4000000; k++) { s[k] = (s[k - 24] + s[k - 55] + 1000000) % 1000000 - 500000; }
// 2. 填充 2000×2000 表格 int idx = 1; for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) a[i][j] = s[idx++];
longlong ans = LLONG_MIN;
// 3. 横向 for (int i = 0; i < N; i++) { vector<int> v; for (int j = 0; j < N; j++) v.push_back(a[i][j]); ans = max(ans, kadane(v)); }
// 4. 纵向 for (int j = 0; j < N; j++) { vector<int> v; for (int i = 0; i < N; i++) v.push_back(a[i][j]); ans = max(ans, kadane(v)); }
// 5. 主对角线 ↘ (i - j 固定) for (int d = -(N - 1); d <= N - 1; d++) { vector<int> v; for (int i = 0; i < N; i++) { int j = i - d; if (j >= 0 && j < N) v.push_back(a[i][j]); } if (!v.empty()) ans = max(ans, kadane(v)); }
// 6. 副对角线 ↙ (i + j 固定) for (int s = 0; s <= 2 * (N - 1); s++) { vector<int> v; for (int i = 0; i < N; i++) { int j = s - i; if (j >= 0 && j < N) v.push_back(a[i][j]); } if (!v.empty()) ans = max(ans, kadane(v)); }