제출 #1275094

#제출 시각아이디문제언어결과실행 시간메모리
1275094lmduc270410Mecho (IOI09_mecho)C++20
46 / 100
1097 ms24860 KiB
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define ldb long double
#define pii pair<int, int>
#define bend(v) v.begin(), v.end()
const int N = 800 + 5, M = 1e6 + 5;
const int mod = 1e9 + 7;
const int base = 311;
const int inf = INT_MAX;
const ll INF = LLONG_MAX;

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

int n, k;
string a[N], b[N];

void ms_bfs(int t){
    queue<pair<pii, int>> qu;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(b[i][j] == 'H') qu.push({{i, j}, t});
        }
    }
    while(!qu.empty()){
        pii ord = qu.front().first;
        int x = ord.first, y = ord.second, remain = qu.front().second;
        qu.pop();
        if(!remain) continue;
        for(int dir = 0; dir < 4; dir++){
            int u = x + dx[dir], v = y + dy[dir];
            if(u < 0 || u >= n || v < 0 || v >= n) continue;
            // cho ong lan vao G HOAC M (M la o bat dau cua Me)
            if(b[u][v] != 'G' && b[u][v] != 'M') continue;
            b[u][v] = 'H'; qu.push({{u, v}, remain - 1});
        }
    }
}

vector<pii> mechoo(vector<pii> cur){
    vector<pii> tmp;
    queue<pair<pii, int>> qu;
    for(pii ord : cur){
        int x = ord.first, y = ord.second;
        if(b[x][y] == 'H') continue;
        qu.push({{x, y}, k});
    }
    while(!qu.empty()){
        pii ord = qu.front().first;
        int x = ord.first, y = ord.second, remain = qu.front().second;
        qu.pop();
        // ô này reachable trong <=k bước -> có thể đứng ở đây cuối phút
        tmp.push_back({x, y});
        if(!remain) continue;
        for(int dir = 0; dir < 4; dir++){
            int u = x + dx[dir], v = y + dy[dir];
            if(u < 0 || u >= n || v < 0 || v >= n) continue;
            if(b[u][v] != 'G' && b[u][v] != 'D' && b[u][v] != 'M') continue;
            if(b[u][v] == 'H') continue; // ko di vao ong
            // dấu visited để khỏi push lại cùng ô nhiều lần trong cùng phút
            if(b[u][v] == 'M') continue; // đã đánh dấu
            // ta cần đánh dấu để tránh push trùng (chỉ trong mô phỏng này)
            b[u][v] = 'M'; qu.push({{u, v}, remain - 1});
        }
    }
    return tmp;
}

bool bfs(){
    vector<pii> be1, be2; //bees
    vector<pii> me; //mecho
    pii en = {-1, -1};
    for(int i = 0; i < n; i++){
        for(int j = 0; j < n; j++){
            if(b[i][j] == 'M') me.push_back({i, j});
            if(b[i][j] == 'H') be1.push_back({i, j});
            if(b[i][j] == 'D') en = {i, j};
        }
    }
    if(en.first == -1) return false;

    while(!me.empty()){
        me = mechoo(me);
        if(b[en.fi][en.se] == 'M') return true;
        be2.clear();
        for(pii ord : be1){
            int x = ord.first, y = ord.second;
            for(int dir = 0; dir < 4; dir++){
                int u = x + dx[dir], v = y + dy[dir];
                if(u < 0 || u >= n || v < 0 || v >= n) continue;
                if(b[u][v] != 'M' && b[u][v] != 'G' && b[u][v] != 'D') continue;
                // ong ko vao D? theo de bai ong ko vao D, neu D la duong ve, khong cho D.
                if(b[u][v] == 'D') continue;
                if(b[u][v] == 'H') continue;
                b[u][v] = 'H'; be2.push_back({u, v});
            }
        }
        be1.clear(); swap(be1, be2);
    }
    return false;
}

bool check(int t){
    for(int i = 0; i < n; i++) b[i] = a[i];
    ms_bfs(t);
    return bfs();
}

void solve(){
    cin>>n>>k;
    for(int i = 0; i < n; i++) cin>>a[i];

    int l = 0, r = n * n, mid; // <-- để r = n*n thay vì 2*n
    int ans = -1;
    while(l <= r){
        mid = (l + r) >> 1;
        if(check(mid)){ ans = mid; l = mid + 1; }
        else r = mid - 1;
    }
    cout<<ans<<"\n";
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...