Submission #45301693


Source Code Expand

#include <bits/stdc++.h>
using namespace std;
namespace r = ranges;
#define BE(x) x.begin(), x.end()
using ll = long long;
template<class T> using vec = vector<T>;

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



    chrono::system_clock::time_point time_a, time_b, time_c;
    time_a = chrono::system_clock::now();



    int t, h, w, i0;
    cin >> t >> h >> w >> i0;
    vec<string> hs(h-1), vs(h);
    for (auto &e : hs) cin >> e;
    for (auto &e : vs) cin >> e;

    const int n = h*w;
    vec<vec<int>> g(n);

    const int di[] = {-1, 1, 0, 0};
    const int dj[] = {0, 0, -1, 1};
    for (int i = 0; i < h; ++i)
    for (int j = 0; j < w; ++j) {
        const int v = i*w+j;
        for (int d = 0; d < 4; ++d) {
            int ni = i+di[d];
            int nj = j+dj[d];
            if (ni < 0 || h <= ni) continue;
            if (nj < 0 || w <= nj) continue;
            if (d==0 && hs[i-1][j]=='1') continue;
            if (d==1 && hs[i][j]  =='1') continue;
            if (d==2 && vs[i][j-1]=='1') continue;
            if (d==3 && vs[i][j]  =='1') continue;
            g[v].push_back(ni*w+nj);
        }
    }

    const int door = i0*w;

    vec<int> level(n,-1);
    int yet = r::count(level,-1);
    while (yet) {
        static int lev = 0;
        for (int i = 0; i < n; ++i) {
            if (level[i] != -1) continue;
            bitset<400> bs;
            auto dfs = [&](auto &f, int v) -> void {
                bs[v] = true;
                for (auto &e : g[v]) {
                    if (level[e] == lev) {
                        bs[e] = true;
                        continue;
                    }
                    if (level[e] != -1) continue;
                    if (bs[e]) continue;
                    if (e == i) continue;
                    f(f, e);
                }
            };
            if (i != door) dfs(dfs, door);
            if (r::count(level,-1)+r::count(level,lev) == (ll)(bs.count()+1)) level[i] = lev;
        }
        int nyet = r::count(level,-1);
        if (yet == nyet) break;
        yet = nyet;
        ++lev;
    }
    vec<pair<int,int>> lev_v(n);
    for (int i = 0; i < n; ++i) {
        lev_v[i] = {level[i],i};
    }
    r::sort(lev_v);



    int k;
    cin >> k;
    vec<int> s(k), d(k);
    for (int i = 0; i < k; ++i) {
        cin >> s[i] >> d[i];
    }
    vec<int> score(k);
    for (int i = 0; i < k; ++i) {
        score[i] = d[i]-s[i]+1;
    }

    vector crops(101, vector(101, vec<tuple<float,float,int>>())); // [m][d] {-(s-m),d-m,i}
    for (int m = 1; m <= t; ++m) {
        for (int i = 0; i < k; ++i) {
            if (s[i] < m) continue;
            tuple<float,float,int> tt = {-(s[i]-m), d[i]-m, i};
            for (int j = d[i]; j <= 100; ++j) {
                crops[m][j].push_back(tt);
            }
        }
    }

    using Plan = vec<tuple<int,int,int,int>>; // k, i, j, s
    Plan ans;
    int score_max = 0;

    const float exp_init = 1;
    const float exp_step = 0.8;
    const float exp_lim  = 16;
    const float powbase = 1.125;

    chrono::milliseconds last_lap(0);
    for (float exp = exp_init; exp <= exp_lim; exp += exp_step) {
        time_c = std::chrono::system_clock::now();
        last_lap = chrono::duration_cast<chrono::milliseconds>(time_c - time_b);
        chrono::milliseconds elapsed = chrono::duration_cast<chrono::milliseconds>(time_c - time_a);
        time_b = time_c;
        if (exp != exp_init && elapsed+last_lap > (chrono::milliseconds)1950) break;

        for (auto &cm : crops)
        for (auto &e : cm) {
            const float spow = pow(powbase,exp);
            const float dpow = pow(powbase,-exp);
            r::sort(e,  [&exp, &spow, &dpow](auto a, auto b) {
                auto f = [&exp, &spow, &dpow](tuple<float,float,int> &x) {
                    auto& [xs, xd, _] = x;
                    return xs*spow + xd*dpow;
                };
                return f(a) < f(b);
            });
        }

        Plan plan;
        int score_sum = 0;
        bitset<40000> done;
        vec<int> harvest(n,-1);
        for (int month = 1; month <= t; ++month) {
            auto cm = crops[month];

            for (auto &[lev,v] : lev_v) {
                if (harvest[v] != -1) continue;

                // check limit
                bitset<400> bs;
                auto dfs = [&](auto &f, int u) -> void {
                    bs[u] = true;
                    for (auto &e : g[u]) {
                        if (e == v) continue;
                        if (bs[e]) continue;
                        if (harvest[e] != -1) {
                            bs[e] = true;
                            continue;
                        }
                        f(f, e);
                    }
                };
                if (harvest[door] == -1 && v != door)
                    dfs(dfs, door);
                int md = 100;
                for (int i = 0; i < n; ++i) {
                    if (bs[i]) continue;
                    if (i == v) continue;
                    md = min(md, harvest[i]);
                }

                // plant
                for (int i = md; i >= 0; --i) {
                    bool flg = false;
                    while (!cm[i].empty()) {
                        auto [_,__,cr] = cm[i].back();
                        cm[i].pop_back();
                        if (done[cr]) continue;
                        flg = true;
                        plan.emplace_back(cr+1, v/w, v%w, month);
                        score_sum += score[cr];
                        done[cr] = true;
                        harvest[v] = d[cr];
                        break;
                    }
                    if (flg) break;
                }
            }
            for (int v = 0; v < n; ++v) {
                if (harvest[v] == month) harvest[v] = -1;
            }
        }
        if (score_sum > score_max) ans = plan;
        // cout << "score:" << score_sum << ", window:" << exp << ", time:" << last_lap << "\n";
    }



    cout << ans.size() << '\n';
    for (auto &[k,i,j,s] : ans) {
        cout << k << ' ' << i << ' ' << j << ' ' << s << '\n';
    }
}

Submission Info

Submission Time
Task A - Crops on Grid
User iboibo
Language C++ 23 (gcc 12.2)
Score 20129475
Code Size 6364 Byte
Status AC
Exec Time 1936 ms
Memory 146484 KiB

Judge Result

Set Name test_ALL
Score / Max Score 20129475 / 50000000
Status
AC × 50
Set Name Test Cases
test_ALL 0000.txt, 0001.txt, 0002.txt, 0003.txt, 0004.txt, 0005.txt, 0006.txt, 0007.txt, 0008.txt, 0009.txt, 0010.txt, 0011.txt, 0012.txt, 0013.txt, 0014.txt, 0015.txt, 0016.txt, 0017.txt, 0018.txt, 0019.txt, 0020.txt, 0021.txt, 0022.txt, 0023.txt, 0024.txt, 0025.txt, 0026.txt, 0027.txt, 0028.txt, 0029.txt, 0030.txt, 0031.txt, 0032.txt, 0033.txt, 0034.txt, 0035.txt, 0036.txt, 0037.txt, 0038.txt, 0039.txt, 0040.txt, 0041.txt, 0042.txt, 0043.txt, 0044.txt, 0045.txt, 0046.txt, 0047.txt, 0048.txt, 0049.txt
Case Name Status Exec Time Memory
0000.txt AC 1924 ms 134148 KiB
0001.txt AC 1723 ms 117760 KiB
0002.txt AC 1825 ms 92416 KiB
0003.txt AC 1872 ms 83816 KiB
0004.txt AC 1726 ms 146484 KiB
0005.txt AC 1825 ms 126520 KiB
0006.txt AC 1654 ms 138020 KiB
0007.txt AC 1789 ms 123516 KiB
0008.txt AC 1657 ms 139144 KiB
0009.txt AC 1910 ms 97584 KiB
0010.txt AC 1788 ms 125040 KiB
0011.txt AC 1719 ms 146220 KiB
0012.txt AC 1853 ms 92996 KiB
0013.txt AC 1914 ms 113628 KiB
0014.txt AC 1766 ms 89740 KiB
0015.txt AC 1703 ms 116508 KiB
0016.txt AC 1854 ms 129932 KiB
0017.txt AC 1816 ms 126556 KiB
0018.txt AC 1795 ms 103880 KiB
0019.txt AC 1813 ms 125640 KiB
0020.txt AC 1893 ms 133260 KiB
0021.txt AC 1857 ms 130268 KiB
0022.txt AC 1830 ms 93244 KiB
0023.txt AC 1873 ms 110608 KiB
0024.txt AC 1741 ms 100800 KiB
0025.txt AC 1874 ms 84164 KiB
0026.txt AC 1811 ms 104872 KiB
0027.txt AC 1656 ms 141188 KiB
0028.txt AC 1932 ms 97584 KiB
0029.txt AC 1892 ms 110712 KiB
0030.txt AC 1780 ms 102904 KiB
0031.txt AC 1770 ms 122024 KiB
0032.txt AC 1935 ms 98292 KiB
0033.txt AC 1911 ms 112136 KiB
0034.txt AC 1782 ms 103312 KiB
0035.txt AC 1903 ms 130816 KiB
0036.txt AC 1806 ms 91100 KiB
0037.txt AC 1854 ms 93976 KiB
0038.txt AC 1883 ms 132324 KiB
0039.txt AC 1672 ms 142356 KiB
0040.txt AC 1768 ms 123524 KiB
0041.txt AC 1769 ms 88804 KiB
0042.txt AC 1768 ms 125496 KiB
0043.txt AC 1897 ms 95580 KiB
0044.txt AC 1828 ms 126988 KiB
0045.txt AC 1848 ms 128348 KiB
0046.txt AC 1787 ms 88340 KiB
0047.txt AC 1856 ms 93908 KiB
0048.txt AC 1936 ms 134796 KiB
0049.txt AC 1860 ms 129664 KiB