Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- int32_t main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- int N;
- cin >> N;
- vector<vector<int>> grid(N + 1, vector<int>(N + 1));
- for(int i = 1; i <= N; ++i)
- for(int j = 1; j <= N; ++j)
- cin >> grid[i][j];
- int M;
- cin >> M;
- vector<vector<int>> a(N + 1, vector<int>(N + 1));
- queue<pair<int,int>> Q;
- while(M--) {
- int x, y;
- cin >> x >> y;
- Q.emplace(x, y);
- a[x][y] = 1;
- }
- const int di[] = {-1, 0, 1, 0, -1, -1, 1, 1},
- dj[] = {0, 1, 0, -1, -1, 1, -1, 1};
- auto inside = [&](int lin, int col) {
- return lin > 0 && col > 0 && lin <= N && col <= N;
- };
- while(!Q.empty()) {
- int i = Q.front().first,
- j = Q.front().second;
- Q.pop();
- for(int k = 0; k < 8; ++k) {
- int iv = i + di[k],
- jv = j + dj[k];
- if(inside(iv, jv) && a[iv][jv] == 0) {
- a[iv][jv] = a[i][j] + 1;
- Q.emplace(iv, jv);
- }
- }
- }
- vector<int> d(N * N);
- for(int i = 1; i <= N; ++i)
- for(int j = 1; j <= N; ++j) {
- if(grid[i][j])
- a[i][j] = -1;
- --a[i][j];
- if(a[i][j] >= 0)
- ++d[a[i][j]];
- }
- while(!d.back())
- d.pop_back();
- int sz = d.size();
- vector<int> sum(sz);
- sum[0] = d[0];
- for(int i = 1; i < sz; ++i)
- sum[i] = sum[i - 1] + d[i];
- int q;
- cin >> q;
- while(q--) {
- int x;
- cin >> x;
- int st = 0, dr = sz - 1, ans = -1;
- while(st <= dr) {
- int mid = (st + dr) >> 1;
- if(sum[mid] >= x) {
- ans = mid;
- dr = mid - 1;
- }
- else
- st = mid + 1;
- }
- cout << ans << ' ';
- }
- }
Add Comment
Please, Sign In to add comment