mr_dot_convict

598D-Igor-in-the-museum-mr.convict

May 16th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. /*author* Priyanshu Shrivastav (from IIT Palakkad) *
  2.  * *_ __ ___  _ ______ ___  _ ____   ___  ___| |_  *
  3.  * | '_ ` _ \| '__/ __/ _ \| '_ \ \ / / |/ __| __| *
  4.  * | | | | | | | | (_| (_) | | | \ V /| | (__| |_  *
  5.  * |_| |_| |_|_|(_)___\___/|_| |_|\_/ |_|\___|\__| *
  6. When I wrote this, only God and I understood what I was doing
  7.  ** * * * * * * * Now, only God knows * * * * * * */
  8. #include         <bits/stdc++.h>
  9. #define x        first
  10. #define y        second
  11. using namespace std;
  12. const int N = (int)1e6 + 10;
  13. int n, m, k;
  14. int rep[N], rnk[N], sz[N], paint[N];
  15. int dx[] = {0, 0, -1, 1};
  16. int dy[] = {1, -1, 0, 0};
  17. vector <string> C;
  18.  
  19. void makeSet() {
  20.    for(int u = 0; u < n * m; ++u)
  21.       rep[u] = u, rnk[u] = 0, sz[u] =  1, paint[u] = 0;
  22. }
  23.  
  24. int findSet(int u) {
  25.    int ru = u;
  26.    while (ru != rep[ru])
  27.       ru = rep[ru];
  28.  
  29.    while (u != rep[u]) {
  30.       int tmp = rep[u];
  31.       rep[u] = ru;
  32.       u = tmp;
  33.    }
  34.    return ru;
  35. }
  36.  
  37. void mergeSet(int u, int v) {
  38.    int ru = findSet(u), rv = findSet(v);
  39.    if (rnk[ru] > rnk[rv]) {
  40.       rep[rv] = rep[ru];
  41.       sz[ru] += sz[rv];
  42.    }
  43.    else {
  44.       rep[ru] = rep[rv];
  45.       sz[rv] += sz[ru];
  46.    }
  47.  
  48.    if (rnk[ru] == rnk[rv]) {
  49.       ++rnk[rv];
  50.    }
  51. }
  52.  
  53. inline bool isValid (int xx, int yy, char c) {
  54.    return xx >= 0 && yy >= 0 && xx < n && yy < m && C[xx][yy] == c;
  55. }
  56.  
  57. void dfs (int ux, int uy, bool vis[], char c) {
  58.    vis[m * ux + uy] = true;
  59.    for (int dir = 0; dir < 4; ++dir) {
  60.       int xx = ux + dx[dir], yy = uy + dy[dir];
  61.  
  62.       if (isValid (xx, yy, c) && !vis[m * xx + yy]) {
  63.          dfs (xx, yy, vis, c);
  64.          mergeSet(m * xx + yy, m * ux + uy);
  65.       }
  66.    }
  67. }
  68.  
  69. void solve() {
  70.    makeSet();
  71.    bool vis[N];
  72.    for (int i = 0; i < n * m; ++i) vis[i] = 0;
  73.  
  74.  
  75.    for (int i = 0; i < n; ++i) {
  76.       for (int j = 0; j < m; ++j) {
  77.          if (C[i][j] == '.' && !vis[m * i + j])
  78.             dfs (i, j, vis, '.');
  79.       }
  80.    }
  81.  
  82.    for (int i = 0; i < n; ++i) {
  83.       for (int j = 0; j < m; ++j) {
  84.          if (C[i][j] == '*') {
  85.             for (int dir = 0; dir < 4; ++dir) {
  86.                int xx = i + dx[dir], yy = j + dy[dir];
  87.                if (isValid(xx, yy, '.')) {
  88.                   int ru = findSet(m * xx + yy);
  89.                   paint[ru] += 1;
  90.                }
  91.             }
  92.          }
  93.       }
  94.    }
  95.  
  96.    int u, v;
  97.    while (k--) {
  98.       cin >> u >> v;
  99.       --u, --v;
  100.       cout << paint[findSet(m * u + v)] << '\n';
  101.    }
  102. }
  103. void read() {
  104.    string S;
  105.    getchar();
  106.    for (int i = 0; i < n; ++i) {
  107.       getline(cin, S);
  108.       cerr << S << '\n';
  109.       C.push_back(S);
  110.    }
  111.  
  112. }
  113.  
  114. signed main() {
  115.    C.clear();
  116.    cin >> n >> m >> k;
  117.    read();
  118.    solve();
  119.    return EXIT_SUCCESS;
  120. }
Add Comment
Please, Sign In to add comment