Submission #1262400

#TimeUsernameProblemLanguageResultExecution timeMemory
1262400phtungCollecting Mushrooms (NOI18_collectmushrooms)C++20
100 / 100
37 ms40504 KiB
#include <bits/stdc++.h>

using namespace std;

#define name "IO"
#define int long long

const int inf = 1e18 + 7;
const int maxn = 5e5 + 5;
int r, c, d, k;
vector<vector<char>> grid;

struct Fenw
{
    vector<vector<int>> tree;
    int n, m;

    Fenw(int n_, int m_)
    {
        n = n_, m = m_;
        tree.resize(n + 5, vector<int>(m + 5, 0));
    }

    void update(int i, int j, int val)
    {
        for(int u = i; u <= n; u += u & -u)
        {
            for(int v = j; v <= m; v += v & -v)
                tree[u][v] += val;
        }
    }

    int preSum(int i, int j)
    {

        int ans = 0;
        for(int u = i; u > 0; u -= u &-u)
        {
            for(int v = j; v > 0; v -= v & -v)
                ans += tree[u][v];
        }
        return ans;
    }

    int query(int i, int j, int u, int v)
    {
        return preSum(u, v) - preSum(i - 1, v) - preSum(u, j - 1) + preSum(i - 1, j - 1);
    }
};

void solve()
{
    cin >> r >> c >> d >> k;
    grid.resize(r + 5, vector<char>(c + 5));

    vector<pair<int,int>> nam, tuoi;

    for(int i = 1; i <= r; i++)
    {
        for(int j = 1; j <= c; j++)
        {
            cin >> grid[i][j];

            if(grid[i][j] == 'M') nam.push_back({i, j});

            if(grid[i][j] == 'S') tuoi.push_back({i, j});
        }
    }

    Fenw bit(r, c);

    for(auto [x, y] : tuoi)
    {
        int i, j, u, v;
        i = max(1ll, x - d), j = max(1ll, y - d);
        u = min(r, x + d), v = min(c, y + d);
        bit.update(i, j, 1);
        bit.update(i, v + 1, -1);
        bit.update(u + 1, j, -1);
        bit.update(u + 1, v + 1, 1);
    }

    int res = 0;

    for(auto [x, y] : nam)
    {
        int num = bit.preSum(x, y);
        res += (num >= k);
    }

    cout << res << "\n";


}

signed main()
{


    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    clock_t start = clock();

    int t = 1;

    while(t--) solve();

    std::cerr << "Time: " << clock() - start << "ms\n";

    return 0;

}
#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...