Submission #1167900

#TimeUsernameProblemLanguageResultExecution timeMemory
1167900CrabCNHDango Maker (JOI18_dango_maker)C++20
100 / 100
171 ms35820 KiB
#include <bits/stdc++.h>

#define task   "BriantheCrab"

#define int    long long
#define pii    pair <int, int>
#define fi     first
#define se     second
#define szf    sizeof
#define sz(s)  (int)((s).size())

using namespace std;

template <class T> void mini (T &t, T f) {if (t > f) t = f;}
template <class T> void maxi (T &t, T f) {if (t < f) t = f;}

const int maxN = 3e3 + 5;
const int inf = 1e18 + 7;
const int mod = 1e9 + 7;

int n, m;
char a[maxN][maxN];
bool visited[maxN][maxN];
bool t1[maxN][maxN], t2[maxN][maxN];;
vector <pair <bool, bool>> all;
int dp[maxN][3];

bool isValid (int x, int y) {
    return (x >= 1 && y >= 1 && x <= n && y <= m);
}

void solve () {
    cin >> n >> m;
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= m; j ++) {
            cin >> a[i][j];
        }
    }
    for (int i = 1; i <= n; i ++) {
        for (int j = 1; j <= m; j ++) {
            if (a[i][j] == 'G' && a[i][j - 1] == 'R' && a[i][j + 1] == 'W') {
                t1[i][j] = 1;
            }
            if (a[i][j] == 'G' && a[i - 1][j] == 'R' && a[i + 1][j] == 'W') {
                t2[i][j] = 1;
            }
        }
    }
    int res = 0;
    //cout << ((t1[2][4] || t2[2][4]) && isValid (2, 4) && !visited[2][4]) << '\n';
    for (int x = 1; x <= n; x ++) {
        for (int y = 1; y <= m; y ++) {
            int curX = x, curY = y;
            all.clear ();
            //cout << curX << ' ' << curY << ' ' << visited[curX][curY] << '\n';
            while ((t1[curX][curY] || t2[curX][curY]) && isValid (curX, curY) && !visited[curX][curY]) {
                all.push_back ({t1[curX][curY], t2[curX][curY]});
                visited[curX][curY] = 1;
                //cout << curX << ' ' << curY << '\n';
                curX ++;
                curY --;
            }
            //cout << "end \n";
            if (all.size () >= 1) {
                int best = 0;
                for (int i = 0; i < (int) all.size (); i ++) {
                    dp[i][0] = dp[i][1] = dp[i][2] = -inf;
                }
                dp[0][0] = 0;
                dp[0][1] = (all[0].fi ? 1 : -inf);
                maxi (best, dp[0][1]);
                dp[0][2] = (all[0].se ? 1 : -inf);
                maxi (best, dp[0][2]);
                for (int i = 1; i < (int) all.size (); i ++) {
                    dp[i][0] = max ({dp[i - 1][0], dp[i - 1][1], dp[i - 1][2]});
                    if (all[i].fi) {
                        dp[i][1] = max (dp[i - 1][0], dp[i - 1][1]) + 1;
                    }
                    if (all[i].se) {
                        dp[i][2] = max (dp[i - 1][0], dp[i - 1][2]) + 1;
                    }
                    maxi (best, max ({dp[i][0], dp[i][1], dp[i][2]}));
                }
                // for (int i = 0; i < (int) all.size (); i ++) {
                    // cout << dp[i][1] << ' ' << dp[i][2] << ' ' << dp[i][3] << '\n';
                // }
                res += best;
            }
        }
    }
    cout << res;
    return;
}

signed main () {
    cin.tie (nullptr) -> sync_with_stdio (false);
    if (fopen (task".inp", "r")) {
        freopen (task".inp", "r", stdin);
        freopen (task".out", "w", stdout);
    }
    int t = 1;
    //cin >> t;
    while (t --) {
        solve ();
    } 
    return 0;
}
// thfdgb

Compilation message (stderr)

dango_maker.cpp: In function 'int main()':
dango_maker.cpp:98:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   98 |         freopen (task".inp", "r", stdin);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
dango_maker.cpp:99:17: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |         freopen (task".out", "w", stdout);
      |         ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...