40pts,求调
查看原帖
40pts,求调
1227025
JKanekiL楼主2025/2/6 12:38
#include <bits/stdc++.h>

using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;

int dx[] = {0, -1, 1, 0, 0}; 
int dy[] = {0, 0, 0, -1, 1};

struct Pt {
    int pos;
    int val;
};

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);

    int N, M, x, y, K;
    std::cin >> N >> M >> x >> y >> K;
    std::vector<std::vector<char>> f(N + 1, std::vector<char>(M + 1));
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            std::cin >> f[i][j];
        }
    }

    std::vector dp(N + 1, std::vector<int>(M + 1, std::numeric_limits<int>::min()));
    dp[x][y] = 0;

    int ans = 0;
    auto dfs = [&](int x, int y, int l, int d, int L) -> void {
        std::deque<Pt> mx;
        for (int i = 1; i <= L; i++) {
            x += dx[d];
            y += dy[d];
            if (x < 1 || x > N || y < 1 || y > M || f[x][y] == 'x') {
                mx.clear();
            } else {
                while (!mx.empty() && dp[x][y] >= (mx.back().val + i - mx.back().pos)) {
                    mx.pop_back();
                }
                mx.push_back({i, dp[x][y]});
                
                while (!mx.empty() && mx.front().pos < i - l) {
                    mx.pop_front();
                }
                
                dp[x][y] = mx.front().val + i - mx.front().pos;
                ans = std::max(ans, dp[x][y]);
            }
        }
    };

    for (int i = 1; i <= K; i++) {
        int s, t, d;
        std::cin >> s >> t >> d;
        int l = t - s + 1;
        if (d == 1) {  
            for (int i = 1; i <= M; i++) {
                dfs(N, i, l, d, N);
            }
        } else if (d == 2) {  
            for (int i = 1; i <= M; i++) {
                dfs(1, i, l, d, N);
            }
        } else if (d == 3) {  
            for (int i = 1; i <= N; i++) {
                dfs(i, M, l, d, M);
            }
        } else if (d == 4) {  
            for (int i = 1; i <= N; i++) {
                dfs(i, 1, l, d, M);
            }
        }
    }

    std::cout << ans << "\n";
    return 0;
}
2025/2/6 12:38
加载中...