Submission #528492

#TimeUsernameProblemLanguageResultExecution timeMemory
528492georgerapeanuDango Maker (JOI18_dango_maker)C++11
100 / 100
856 ms244156 KiB
#include <bits/stdc++.h>

using namespace std;

class BipartiteMatcher{
  int n, m;
  vector<int> l;
  vector<int> r;
  vector<vector<int> > graph;
  vector<bool> viz;

  bool pairup(int nod){
    if(viz[nod] == true){
      return false;
    }
    viz[nod] = true;
    for(auto it:graph[nod]){
      if(r[it] == -1){
        l[nod] = it;
        r[it] = nod;
        return true;
      }
    }
    for(auto it:graph[nod]){
      if(pairup(r[it])){
        l[nod] = it;
        r[it] = nod;
        return true;
      }
    }
    return false;
  }

  public:

  BipartiteMatcher(int n, int m) {
    this->n = n;
    this->m = m;
    this->l = vector<int>(n, -1);
    this->r = vector<int>(m, -1);
    this->graph = vector<vector<int> >(n, vector<int>());
    this->viz = vector<bool>(n, false);
  }

  void add_edge(int x, int y){
    graph[x].push_back(y);
  }

  int solve(){
    bool ok = true;

    while(ok){
      ok = false;
      for(int i = 0;i < n;i++){
        viz[i] = false;
      }
      for(int i = 0;i < n;i++){
        if(l[i] == -1 && pairup(i)){
          ok = true;
        }
      }
    }
    int cuplaj = 0;
    for(int i = 0;i < n;i++){
      cuplaj += (l[i] != -1);
    }
    return cuplaj;
  }
};

int main(){
  
    int n, m;
    cin >> n >> m;
    vector<string> v(n,"");
    vector<vector<int> > group(n, vector<int>(m, -1));

    for(int i = 0;i < n;i++){
      cin >> v[i];
    }

    int cnt_horizontal = 0;
    int cnt_vertical = 0;

    for(int i = 0;i < n;i++){
      for(int j = 0;j < m;j++){
        if(j + 2 < m && v[i][j] == 'R' && v[i][j + 1] == 'G' && v[i][j + 2] == 'W'){
          group[i][j] = cnt_horizontal;
          group[i][j + 1] = cnt_horizontal;
          group[i][j + 2] = cnt_horizontal;
          cnt_horizontal++;
        }
        if(i + 2 < n && v[i][j] == 'R' && v[i + 1][j] == 'G' && v[i + 2][j] == 'W'){
          cnt_vertical++;
        }
      }
    }
    
    BipartiteMatcher matcher(cnt_horizontal, cnt_vertical);
    
    int last_vertical = 0;
    for(int i = 0;i < n;i++){
      for(int j = 0;j < m;j++){
        if(i + 2 < n && v[i][j] == 'R' && v[i + 1][j] == 'G' && v[i + 2][j] == 'W'){
          if(group[i][j] != -1){
            matcher.add_edge(group[i][j], last_vertical);
          }
          if(group[i + 1][j] != -1){
            matcher.add_edge(group[i + 1][j], last_vertical);
          }
          if(group[i + 2][j] != -1){
            matcher.add_edge(group[i + 2][j], last_vertical);
          }
          last_vertical++;
        }
      }
    }


    printf("%d", cnt_horizontal + cnt_vertical - matcher.solve());
    
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...