답안 #375684

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
375684 2021-03-09T16:53:47 Z peijar Dango Maker (JOI18_dango_maker) C++17
0 / 100
1 ms 492 KB
#include <bits/stdc++.h>
using namespace std;

const int MAXN =3000;
char couleur[MAXN][MAXN];
bool pris[MAXN][MAXN];
int idDumpling[MAXN][MAXN];
vector<int> adj[MAXN];
int matchAvec[MAXN];
bool vu[MAXN];

/*   	 x
 *   x 
 * . . .  
 *
 * 		.
 * 	x	.
 * x  .
 * Graphe biparti : on cherche max independent set 
 * si S independant max, si e arete, une extremité pas dans S !
 * Donc complementaire de S = min vertex cover
 * Donc nbDumplingsPotentiels - maxMatch = rep
 */

bool dfs(int u)
{
	if (vu[u]) return false;
	vu[u] = true;
	for (auto v : adj[u])
		if (matchAvec[v] == -1 or dfs(matchAvec[v]))
		{
			matchAvec[v] = u;
			return true;
		}
	return false;
}


signed main(void)
{
	ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	
	int nbLig, nbCol;
	cin >> nbLig >> nbCol;
	for (int iLig(0); iLig < nbLig; ++iLig)
		for (int iCol(0); iCol < nbCol; ++iCol)
			cin >> couleur[iLig][iCol];
	int nbDumplingsPotentiels(0);
	for (int iLig(0); iLig < nbLig; ++iLig)
		for (int iCol(0); iCol < nbCol; ++iCol)
		{
			if (iLig + 2 < nbLig and couleur[iLig][iCol] == 'R'
					and couleur[iLig+1][iCol] == 'G' and couleur[iLig+2][iCol] == 'W')
				nbDumplingsPotentiels++;
			if (iCol+2 < nbCol and couleur[iLig][iCol] == 'R' and 
					couleur[iLig][iCol+1] == 'G' and couleur[iLig][iCol+2] == 'W')
				nbDumplingsPotentiels++;
		}
	int nbVu(0);
	for (int iLig(0); iLig < nbLig; ++iLig)
		for (int iCol(0); iCol < nbCol; ++iCol)
		{
			idDumpling[iLig][iCol] = -1;
			if (iLig + 2 < nbLig and couleur[iLig][iCol] == 'R'
					and couleur[iLig+1][iCol] == 'G' and couleur[iLig+2][iCol] == 'W')
				idDumpling[iLig][iCol] = nbVu++;
		}
	int nbGauche = nbVu;
	nbVu = 0;
	for (int iLig(0); iLig < nbLig; ++iLig)
		for (int iCol(0); iCol < nbCol; ++iCol)
			if (iCol+2 < nbCol and couleur[iLig][iCol] == 'R' and 
					couleur[iLig][iCol+1] == 'G' and couleur[iLig][iCol+2] == 'W')
			{
				// R G W
				matchAvec[nbVu] = -1;
				if (idDumpling[iLig][iCol] != -1)
					adj[idDumpling[iLig][iCol]].push_back(nbVu);
				if (iLig and idDumpling[iLig-1][iCol+1] != -1)
					adj[idDumpling[iLig-1][iCol+1]].push_back(nbVu);
				if (iLig > 1 and idDumpling[iLig-2][iCol+2] != -1)
					adj[idDumpling[iLig-2][iCol+2]].push_back(nbVu++);
			}
	int maxMatching(0);
	for (int i(0); i < nbGauche; ++i)
	{
		fill(vu, vu + nbGauche, false);
		maxMatching += dfs(i);
	}
	int ret = nbDumplingsPotentiels - maxMatching;
	cout << ret << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 492 KB Output is correct
6 Correct 1 ms 492 KB Output is correct
7 Correct 1 ms 492 KB Output is correct
8 Correct 1 ms 492 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Correct 1 ms 492 KB Output is correct
11 Incorrect 1 ms 492 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 492 KB Output is correct
6 Correct 1 ms 492 KB Output is correct
7 Correct 1 ms 492 KB Output is correct
8 Correct 1 ms 492 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Correct 1 ms 492 KB Output is correct
11 Incorrect 1 ms 492 KB Output isn't correct
12 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 1 ms 364 KB Output is correct
3 Correct 1 ms 364 KB Output is correct
4 Correct 1 ms 492 KB Output is correct
5 Correct 1 ms 492 KB Output is correct
6 Correct 1 ms 492 KB Output is correct
7 Correct 1 ms 492 KB Output is correct
8 Correct 1 ms 492 KB Output is correct
9 Correct 1 ms 492 KB Output is correct
10 Correct 1 ms 492 KB Output is correct
11 Incorrect 1 ms 492 KB Output isn't correct
12 Halted 0 ms 0 KB -