제출 #1306302

#제출 시각아이디문제언어결과실행 시간메모리
1306302duyanhchupapiDango Maker (JOI18_dango_maker)C++20
100 / 100
409 ms206500 KiB
#include <bits/stdc++.h>
using namespace std; 
using ll = long long; 
const int N = 3e3 + 3, M = 3e6 + 3;
int n, m, _n, _m, id[N][N], iter = 0;
basic_string <int> g[M];
char a[N][N];
bool col[N][N];
bool stick(char A, char B, char C) {
	if (A == 'R' && B == 'G' && C == 'W') return true;
	return false;
}

vector <int> seen, dist, matchL, matchR;

bool dfs(int u) {
    if(seen[u] == iter) return 0;
    seen[u] = iter;

    for(int v : g[u]) {
        if(matchR[v] == -1) {
            matchL[u] = v; 
			matchR[v] = u;
            return 1;
        }
    }

    for(int v : g[u]) {
        if(dist[matchR[v]] == dist[u] + 1 && dfs(matchR[v])) {
            matchL[u] = v; 
			matchR[v] = u;
            return 1;
        }
    }

    return 0;
}

int main() { 
	ios_base::sync_with_stdio(0); cin.tie(0);
	// freopen(".INP", "r", stdin);
	// freopen(".OUT", "w", stdout);
	cin >> _n >> _m;

	for (int i=1;i<=_n;++i) 
		for (int j=1;j<=_m;++j) cin >> a[i][j];
		
	for (int i=1;i<=_n;++i) {
		for (int j=1;j<=_m;++j) {
			if (stick(a[i][j], a[i + 1][j], a[i + 2][j])) {
				col[i][j] = 1;
				id[i][j] = ++n;
			}
			
			if (stick(a[i][j], a[i][j + 1], a[i][j + 2])) {
				m++;
				if (col[i][j]) g[id[i][j]].push_back(m);
				if (col[i - 1][j + 1]) g[id[i - 1][j + 1]].push_back(m);
				if (i != 1 && col[i - 2][j + 2]) g[id[i - 2][j + 2]].push_back(m);
 			}

		}
	} 
	
	matchL.assign(n + 1, -1);
	matchR.assign(m + 1, -1);
	dist.assign(n + 1, 0);
	seen.assign(n + 1, 0);
	
    int ans = 0;
    while (1) {
        queue <int> q;
        for(int u = 1; u <= n; ++u) {
            if(matchL[u] == -1) dist[u] = 0, q.push(u);
            else dist[u] = -1;
        }

        while(q.size()) {
            int u = q.front(); 
			q.pop();
			
            for(int v : g[u]) {
                if(matchR[v] != -1 && dist[matchR[v]] == -1) {
                    dist[matchR[v]] = dist[u] + 1;
                    q.push(matchR[v]);
                }
            }
        }

        int add = 0;
        ++iter;
        for(int u = 1; u <= n; ++u) 
			if(matchL[u] == -1) add += dfs(u);
        
        if(add == 0) break;
        ans += add;
    }
	
	cout << n + m - ans;
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...