Advertisement
vlatkovski

cave WA

Mar 2nd, 2020
442
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.78 KB | None | 0 0
  1.  
  2. // Problem : Problem 1. Cave Paintings
  3. // Contest : USACO 2020 January Contest, Platinum
  4. // URL : http://usaco.org/index.php?page=viewproblem2&cpid=996
  5. // Memory Limit : 256 MB
  6. // Time Limit : 4000 ms
  7. // Powered by CP Editor (https://github.com/cpeditor/cp-editor)
  8.  
  9. #include <bits/stdc++.h>
  10. using namespace std;
  11. typedef long long ll;
  12. typedef pair<int, int> pii;
  13.  
  14. const int mod = 1e9 + 7;
  15.  
  16. inline int add(int x, int y) {
  17.     x += y;
  18.     if (x >= mod) x -= mod;
  19.     return x;
  20. }
  21. inline int mult(int x, int y) {
  22.     return (ll)x * y % mod;
  23. }
  24.  
  25. const int N = 1010;
  26.  
  27. int ans;
  28. int R, C;
  29. int grid[N][N];
  30. int prod[N*N];
  31. int val[N*N];
  32.  
  33. inline int conv(int r, int c) {
  34.     return r*C + c;
  35. }
  36.  
  37. struct DSU {
  38.     int p[N*N], rank[N*N], maxrow[N*N];
  39.     inline int get(int x) {
  40.         return p[x] == x ? x : (p[x] = get(p[x]));
  41.     }
  42.     inline bool unite(int x, int y) {
  43.         x = get(x), y = get(y);
  44.         if (x == y) return false;
  45.         if (rank[x] < rank[y]) swap(x, y);
  46.         if (rank[x] == rank[y]) ++rank[x];
  47.         p[y] = x;
  48.         maxrow[x] = max(maxrow[x], maxrow[y]);
  49.         return true;
  50.     }
  51. } dsu;
  52.  
  53. int main() {
  54.     ios::sync_with_stdio(false);
  55.     cin.tie(0);
  56.     #ifndef _DEBUG
  57.     freopen("cave.in", "r", stdin);
  58.     freopen("cave.out", "w", stdout);
  59.     #endif
  60.     cin >> R >> C;
  61.     for (int i = 0; i < N*N; ++i) {
  62.         dsu.p[i] = i;
  63.         dsu.rank[i] = 0;
  64.         dsu.maxrow[i] = i/C;
  65.         val[i] = 0;
  66.     }
  67.     for (int r = R-1; r >= 0; --r) {
  68.         for (int c = 0; c < C; ++c) {
  69.             char ch;
  70.             cin >> ch;
  71.             grid[r][c] = ch == '.' ? 0 : 1;
  72.         }
  73.     }
  74.     ans = 1;
  75.     for (int row = 1; row < R; ++row) {
  76.         //cout << "row="<<row<<"\n";
  77.         for (int col = 0; col < C; ++col) {
  78.             if (grid[row][col]) continue;
  79.             int l = col;
  80.             while (col < C && !grid[row][col]) ++col;
  81.             // [l, r] empty
  82.             //cout << "["<<l<<","<<col-1<<"]\n";
  83.             int prd = 1;
  84.             for (int x = l; x < col; ++x) {
  85.                 int id1 = dsu.get(conv(row, x));
  86.                 dsu.unite(conv(row, l), id1);
  87.                 if (!grid[row-1][x]) {
  88.                     int id2 = dsu.get(conv(row-1, x));
  89.                     if (id2 != id1) {
  90.                         if (dsu.maxrow[id2] == row) {
  91.                             //cout<<"x="<<x<<" prodbelow="<<prod[id2]<<"\n";
  92.                             prd = prod[id2];
  93.                             dsu.unite(id1, id2);
  94.                         } else {
  95.                             //cout<<"x="<<x<<" valbelow="<<val[id2]<<"\n";
  96.                             prd = mult(prd, val[id2]);
  97.                             dsu.unite(id1, id2);
  98.                         }
  99.                     }
  100.                 }
  101.             }
  102.             //cout << "val="<<add(prd,1)<<"\n";
  103.             int id = dsu.get(conv(row, l));
  104.             prod[id] = prd;
  105.             val[id] = add(prd, 1);
  106.             --col;
  107.         }
  108.         for (int col = 0; col < C; ++col) {
  109.             if (grid[row-1][col]) continue;
  110.             int l = col;
  111.             while (col < C && !grid[row-1][col]) ++col;
  112.             int id = dsu.get(conv(row-1, l));
  113.             if (dsu.maxrow[id] == row-1) {
  114.                 // wasnt brought up to current row
  115.                 // which means it is isolated
  116.                 ans = mult(ans, val[id]);
  117.                 val[id] = 1;
  118.             }
  119.             --col;
  120.         }
  121.     }
  122.     cout << ans << '\n';
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement