Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #define fi first
- #define se second
- #define pb push_back
- #define pf push_front
- #define popb pop_back
- #define popf pop_front
- #define ins insert
- #define pq priority_queue
- #define minele min_element
- #define maxele max_element
- #define lb lower_bound //first pos >= val
- #define ub upper_bound // first pos > val
- #define cnt_bit __builtin_popcount
- #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
- //#pragma GCC optimize("Ofast")
- //#pragma GCC target("avx,avx2,fma")
- using namespace std;
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- typedef long long ll;
- typedef pair<ll, ll> pll;
- typedef pair<int, int> pii;
- int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
- int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
- const ll oo = 1e18;
- const ll maxN = 1e6;
- /* Author : Le Ngoc Bao Anh, 10A5, LQD High School for Gifted Student */
- void maximize(int &a, int b) {
- a = max(a, b);
- }
- void minimize(int &a, int b) {
- a = min(a, b);
- }
- const int N = 5005;
- struct E {
- int x, y, dist;
- };
- vector<E> ed;
- ll dp[N][3][2], ndp[N][3][2];
- int a[N];
- void solve() {
- int n, m;
- cin >> n >> m;
- auto f = [&](int i, int j) -> int {
- return (i - 1) * m + j;
- };
- auto maximize = [&](ll &x, ll y) -> void {
- if(x < y) x = y;
- };
- auto minimize = [&](ll &x, ll y) -> void {
- if(x > y) x = y;
- };
- for(int i = 1; i <= n; i++) {
- for(int j = 1; j <= m; j++) cin >> a[f(i, j)];
- }
- for(int i = 1; i <= n; i++) {
- for(int j = 1; j <= m; j++) {
- int r = f(i, j);
- dp[r][0][0] = dp[r][0][1] = a[r];
- dp[r][1][0] = dp[r][2][0] = -oo;
- dp[r][1][1] = dp[r][2][1] = oo;
- for(int x = 0; x < 3; x++) {
- for(int y = 0; y < 2; y++) ndp[r][x][y] = dp[r][x][y];
- }
- if(i == 1 && j == 1) continue;
- int dist = (i - 1) * (i - 1) + (j - 1) * (j - 1);
- ed.pb({i - 1, j - 1, dist});
- }
- }
- sort(ed.begin(), ed.end(), [&](E _a, E _b) {
- return _a.dist < _b.dist;
- });
- int ed_num = ed.size(); ll ans = 0;
- for(int c = 0; c < ed_num; c++) {
- int x = ed[c].x, y = ed[c].y;
- for(int i = 1; i <= n; i++) {
- for(int j = 1; j <= m; j++) {
- int r = f(i, j);
- for(int ii = 0; ii < 2; ii++) {
- for(int jj = 0; jj < 2; jj++) {
- int fx = i + (ii ? x : -x);
- int fy = j + (jj ? y : -y);
- if(fx > 0 && fy > 0 && fx <= n && fy <= m) {
- int b = f(fx, fy);
- maximize(ndp[b][1][0], dp[r][0][0] + a[b]);
- maximize(ndp[b][2][0], dp[r][1][0] + a[b]);
- maximize(ndp[b][2][0], dp[r][2][0] + a[b]);
- minimize(ndp[b][1][1], dp[r][0][1] + a[b]);
- minimize(ndp[b][2][1], dp[r][1][1] + a[b]);
- minimize(ndp[b][2][1], dp[r][2][1] + a[b]);
- }
- }
- }
- }
- }
- if(c < ed_num - 1 && ed[c].dist < ed[c + 1].dist) {
- for(int i = 1; i <= n * m; i++) {
- for(int x = 0; x < 3; x++) {
- for(int y = 0; y < 2; y++) {
- dp[i][x][y] = ndp[i][x][y];
- }
- }
- }
- }
- }
- for(int i = 1; i <= n * m; i++) {
- maximize(ans, ndp[i][2][0]);
- maximize(ans, -ndp[i][2][1]);
- }
- cout << ans;
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #else
- //online
- #endif
- int tc = 1, ddd = 0;
- // cin >> tc;
- while(tc--) {
- //ddd++;
- //cout << "Case #" << ddd << ": ";
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement