Alex_tz307

Splatoon

Dec 12th, 2020
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5.  
  6. int32_t main() {
  7.     ios_base::sync_with_stdio(false);
  8.     cin.tie(nullptr);
  9.     cout.tie(nullptr);
  10.     int N;
  11.     cin >> N;
  12.     vector<vector<int>> grid(N + 1, vector<int>(N + 1));
  13.     for(int i = 1; i <= N; ++i)
  14.         for(int j = 1; j <= N; ++j)
  15.             cin >> grid[i][j];
  16.     int M;
  17.     cin >> M;
  18.     vector<vector<int>> a(N + 1, vector<int>(N + 1));
  19.     queue<pair<int,int>> Q;
  20.     while(M--) {
  21.         int x, y;
  22.         cin >> x >> y;
  23.         Q.emplace(x, y);
  24.         a[x][y] = 1;
  25.     }
  26.     const int di[] = {-1, 0, 1, 0, -1, -1, 1, 1},
  27.               dj[] = {0, 1, 0, -1, -1, 1, -1, 1};
  28.     auto inside = [&](int lin, int col) {
  29.         return lin > 0 && col > 0 && lin <= N && col <= N;
  30.     };
  31.     while(!Q.empty()) {
  32.         int i = Q.front().first,
  33.             j = Q.front().second;
  34.         Q.pop();
  35.         for(int k = 0; k < 8; ++k) {
  36.             int iv = i + di[k],
  37.                 jv = j + dj[k];
  38.             if(inside(iv, jv) && a[iv][jv] == 0) {
  39.                 a[iv][jv] = a[i][j] + 1;
  40.                 Q.emplace(iv, jv);
  41.             }
  42.         }
  43.     }
  44.     vector<int> d(N * N);
  45.     for(int i = 1; i <= N; ++i)
  46.         for(int j = 1; j <= N; ++j) {
  47.             if(grid[i][j])
  48.                 a[i][j] = -1;
  49.             --a[i][j];
  50.             if(a[i][j] >= 0)
  51.                 ++d[a[i][j]];
  52.         }
  53.     while(!d.back())
  54.         d.pop_back();
  55.     int sz = d.size();
  56.     vector<int> sum(sz);
  57.     sum[0] = d[0];
  58.     for(int i = 1; i < sz; ++i)
  59.         sum[i] = sum[i - 1] + d[i];
  60.     int q;
  61.     cin >> q;
  62.     while(q--) {
  63.         int x;
  64.         cin >> x;
  65.         int st = 0, dr = sz - 1, ans = -1;
  66.         while(st <= dr) {
  67.             int mid = (st + dr) >> 1;
  68.             if(sum[mid] >= x) {
  69.                 ans = mid;
  70.                 dr = mid - 1;
  71.             }
  72.             else
  73.                 st = mid + 1;
  74.         }
  75.         cout << ans << ' ';
  76.     }
  77. }
  78.  
Add Comment
Please, Sign In to add comment