Submission #1297386

#TimeUsernameProblemLanguageResultExecution timeMemory
1297386buiphucan2008Cultivation (JOI17_cultivation)C++20
5 / 100
2094 ms164796 KiB
#include <bits/stdc++.h>
using namespace std;
#define NAME "DISPERSAL"
#define int long long
#define pii pair < int , int >
#define fi first
#define se second
const int N = 1e6 + 3;
int r, c, n;
pii tree[N];
namespace Subtask1 {
    int wind[N], huong[5];
    int maxWind, cnt, res;
    map < pii, int > mp;
    bool checkSub1() {
        return (r <= 4 && c <= 4);
    }
    void init() {
        mp.clear();
        cnt = n;
//        for (int i = 0; i <= 3; i++) last[i] = 0;
        for (int i = 1; i <= n; i++) {
            mp[tree[i]] = 1;
        }
    }

    bool inside(int x, int y) {
        return ((x >= 1 && y >= 1) && (x <= r && y <= c));
    }
    void update() {
        for (int i = 1; i <= maxWind; i++) {
            for (pair < pii, int > w: mp) {
                if (w.se > i) continue;
                int x = w.fi.fi, y = w.fi.se;
                if (wind[i] == 0) {
                    y--;
                }
                else if (wind[i] == 1) {
                    x--;
                }
                else if (wind[i] == 2) {
                    y++;
                }
                else if (wind[i] == 3) {
                    x++;
                }
                if (!inside(x, y)) continue;
                if (mp[{x, y}] == 0) {
                    mp[{x, y}] = i + 1;
                    cnt++;
                }
            }
            if (cnt == r * c) {
                res = min(res, i);
                return;
            }
        }
    }
    void Try(int id) {
        if (id > maxWind) {
            init();
            update();
//            for (int i = 1; i <= maxWind; i++) {
//                cout << wind[i] << " ";
//            }
//            cout << res << " " << '\n';
//            if (wind[1] % 2 == 0 && wind[3] % 2 == 0)
//                cout << last[0] << " " << last[1] << '\n';
            return;
        }
        else {
            for (int i = 0; i <= 3; i++) {
                if (huong[i % 2] >= max(r, c))
                    continue;
                wind[id] = i;
                huong[i % 2]++;
                Try(id + 1);
                huong[i % 2]--;
            }
        }
    }
    void solve() {
//        checkSub1();
        init();
        for (int i = 0; i <= 3; i++) {
            huong[i] = 0;
        }
        for (int i = 0; i <= maxWind; i++) {
            wind[i] = 0;
        }
        maxWind = r + c - 1;
        res = maxWind;
//        wind[1] = 3;
//        wind[2] = 3;
//        wind[3] = 0;
//        wind[4] = 0;
//        wind[5] = 3;
//        update();

        Try(1);
        cout << res;
    }
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    // freopen(NAME".inp","r",stdin);
    // freopen(NAME".out","w",stdout);

    cin >> r >> c >> n;
    for (int i = 1; i <= n; i++) {
        int x, y;
        cin >> x >> y;
        tree[i] = {x, y};
    }
    Subtask1::solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...