Submission #794524

# Submission time Handle Problem Language Result Execution time Memory
794524 2023-07-26T15:20:19 Z peijar Virus Experiment (JOI19_virus) C++17
100 / 100
672 ms 32160 KB
#include <bits/stdc++.h>
#define int long long
using namespace std;
 
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define rep(i, a, b) for(int i = (a); i < (b); i++)
#define sz(v) ((int)((v).size()))
 
template<typename T>
void chmax(T &x, const T &v) { if (x < v) x = v; }
template<typename T>
void chmin(T &x, const T &v) { if (x > v) x = v; }
 
using pii = pair<int, int>;
using vi = vector<int>;
 
string to_string(string s) { return s; }
template <typename T> string to_string(T v) {
	bool first = true;
	string res = "[";
	for (const auto &x : v) {
		if (!first)
			res += ", ";
		first = false;
		res += to_string(x);
	}
	res += "]";
	return res;
}
 
template <typename A, typename B>
string to_string(pair<A, B> p) {
  return "(" + to_string(p.first) + ", " + to_string(p.second) + ")";
}
 
void dbg_out() { cout << endl; }
template <typename Head, typename... Tail> void dbg_out(Head H, Tail... T) {
	cout << ' ' << to_string(H);
	dbg_out(T...);
}
 
#ifdef DEBUG
#define dbg(...) cout << "(" << #__VA_ARGS__ << "):", dbg_out(__VA_ARGS__)
#else
#define dbg(...)
#endif
 
const int MAX_THRESHOLD = 1e5 + 5; // U
const int MAX_DIM = 805;
const int MAX_CASE = MAX_DIM * MAX_DIM;
int M, R, C;
string meteo;
int U[MAX_DIM][MAX_DIM];
 
int numero(int l, int c) {
	return l*C + c;
}
 
pii ligCol(int cell) {
	return {cell/C, cell % C};
}
int drepr[MAX_CASE], dsz[MAX_CASE];
void init() {
	rep(i, 0, R*C) {
		drepr[i] = i;
		dsz[i] = 1;
	}
}
int find(int a) {
	if (drepr[a] == a) return a;
	return drepr[a] = find(drepr[a]);
}
 
void unite(int parent, int child) {
	parent = find(parent), child = find(child);
	if (parent == child) return;
	drepr[child] = parent;
	dsz[parent] += dsz[child];
}
 
int mapChar[256];
int bestSeg[1 << 4];
void calcSeg() {
	rep(mask, 0, 16) {
		int best = 0, cur = 0;
		for (char c : meteo) {
			if ((1 << mapChar[c]) & mask) {
				++cur;
			} else {
				cur = 0;
			}
			chmax(best, cur);
		}
		if (best >= M) best = MAX_THRESHOLD;
		bestSeg[mask] = best;
	}
}
 
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> M >> R >> C;
	cin >> meteo;
	meteo.append(meteo);
	mapChar['N'] = 0, mapChar['W'] = 1, mapChar['E'] = 2, mapChar['S'] = 3;
	vector<int> deltas(256);
	deltas['N'] = C, deltas['S'] = -C; // l*C + c
	if (C > 1) {
		deltas['W'] = 1, deltas['E'] = -1;
	}
	calcSeg();
	// rep(mask, 0, 16) {
	// 	dbg(mask, bestSeg[mask]);
	// }
	rep(i, 0, R) rep(j, 0, C) {
		cin >> U[i][j];
	}
	init();
	priority_queue<pii, vector<pii>, greater<pii>> pq;
	rep(lig, 0, R) rep(col, 0, C) {
		if (U[lig][col] != 0) {
			pq.push({1, numero(lig, col)});
		}
	}
 
	auto getVoisins = [&] (int cell) {
		vector<int> voisins;
		auto [lig, col] = ligCol(cell);
		rep(dl, -1, 2) rep(dc, -1, 2) if ((dl==0)^(dc==0)) {
			int nl = lig+dl, nc = col+dc;
			if (nl >= 0 && nl < R && nc >= 0 && nc < C && U[nl][nc] != 0) {
				voisins.push_back(numero(nl, nc));
			}
			}
		return voisins;
	};
 
	int best = 1e9;
	int nbBest = 0;
	auto updAns = [&] (int proposal) {
		if (proposal < best) {
			best = proposal, nbBest = 1;
		} else if (proposal == best) {
			++nbBest;
		}
	};
	vector<int> isInfected(R*C);
	vector<bool> mark(R*C, false);
	int timeInf = 0;
	auto discover = [&] (int depart) {
		int compDepart = find(depart);
		++timeInf;
		queue<int> bfs;
		isInfected[depart] = timeInf;
		for (int v : getVoisins(depart)) {
			bfs.push(v);
		}
		int nbSeen = 1; // compte depart
		while (!bfs.empty()) {
			int cur = bfs.front();
			bfs.pop();
			if (isInfected[cur] == timeInf) continue;
			dbg(depart, "voit"s, cur);
			int mask = 0;
			for (int v : getVoisins(cur)) {
				if (isInfected[v] != timeInf) continue;
				int diff = cur - v;
				char dir = '~';
				for (char c : "NWSE") {
					if (diff == deltas[c]) dir = c;
				}
				assert(dir != '~');
				mask += 1 << mapChar[dir];
			}
			auto [lig, col] = ligCol(cur);
			if (U[lig][col] <= bestSeg[mask]) {
				int compCur = find(cur);
				if (compCur != compDepart) {
					if (mark[compCur]) {
						mark[compDepart] = true;
						return;
					}
					// merge depart dans cur
					unite(cur, depart);
					pq.push({dsz[compCur], compCur});
					return;
				}
				isInfected[cur] = timeInf;
				++nbSeen;
				for (int v : getVoisins(cur)) {
					bfs.push(v);
				}
			}
		}
		// composante stable
		updAns(nbSeen);
		dbg(depart, compDepart, "stable"s);
		mark[compDepart] = true;
	};
	while (!pq.empty()) {
		auto [szCell, cell] = pq.top();
		pq.pop();
		if (szCell != dsz[cell]) continue;
		discover(cell);
	}
	cout << best << '\n';
	cout << nbBest*best << '\n';
}

Compilation message

virus.cpp: In function 'void calcSeg()':
virus.cpp:88:22: warning: array subscript has type 'char' [-Wchar-subscripts]
   88 |    if ((1 << mapChar[c]) & mask) {
      |                      ^
virus.cpp: In lambda function:
virus.cpp:174:26: warning: array subscript has type 'char' [-Wchar-subscripts]
  174 |     mask += 1 << mapChar[dir];
      |                          ^~~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 596 KB Output is correct
2 Correct 483 ms 31936 KB Output is correct
3 Correct 483 ms 31852 KB Output is correct
4 Correct 292 ms 31916 KB Output is correct
5 Correct 428 ms 31968 KB Output is correct
6 Correct 2 ms 3540 KB Output is correct
7 Correct 626 ms 32104 KB Output is correct
8 Correct 160 ms 13160 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 5 ms 724 KB Output is correct
3 Correct 4 ms 724 KB Output is correct
4 Correct 5 ms 724 KB Output is correct
5 Correct 5 ms 724 KB Output is correct
6 Correct 6 ms 888 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 5 ms 760 KB Output is correct
9 Correct 2 ms 596 KB Output is correct
10 Correct 4 ms 724 KB Output is correct
11 Correct 2 ms 596 KB Output is correct
12 Correct 2 ms 724 KB Output is correct
13 Correct 6 ms 888 KB Output is correct
14 Correct 6 ms 888 KB Output is correct
15 Correct 6 ms 888 KB Output is correct
16 Correct 6 ms 888 KB Output is correct
17 Correct 4 ms 852 KB Output is correct
18 Correct 3 ms 664 KB Output is correct
19 Correct 6 ms 888 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 596 KB Output is correct
2 Correct 483 ms 31936 KB Output is correct
3 Correct 483 ms 31852 KB Output is correct
4 Correct 292 ms 31916 KB Output is correct
5 Correct 428 ms 31968 KB Output is correct
6 Correct 2 ms 3540 KB Output is correct
7 Correct 626 ms 32104 KB Output is correct
8 Correct 160 ms 13160 KB Output is correct
9 Correct 0 ms 340 KB Output is correct
10 Correct 5 ms 724 KB Output is correct
11 Correct 4 ms 724 KB Output is correct
12 Correct 5 ms 724 KB Output is correct
13 Correct 5 ms 724 KB Output is correct
14 Correct 6 ms 888 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 5 ms 760 KB Output is correct
17 Correct 2 ms 596 KB Output is correct
18 Correct 4 ms 724 KB Output is correct
19 Correct 2 ms 596 KB Output is correct
20 Correct 2 ms 724 KB Output is correct
21 Correct 6 ms 888 KB Output is correct
22 Correct 6 ms 888 KB Output is correct
23 Correct 6 ms 888 KB Output is correct
24 Correct 6 ms 888 KB Output is correct
25 Correct 4 ms 852 KB Output is correct
26 Correct 3 ms 664 KB Output is correct
27 Correct 6 ms 888 KB Output is correct
28 Correct 487 ms 32112 KB Output is correct
29 Correct 388 ms 32092 KB Output is correct
30 Correct 395 ms 32056 KB Output is correct
31 Correct 477 ms 31468 KB Output is correct
32 Correct 483 ms 31688 KB Output is correct
33 Correct 315 ms 31928 KB Output is correct
34 Correct 672 ms 31904 KB Output is correct
35 Correct 377 ms 23428 KB Output is correct
36 Correct 621 ms 31940 KB Output is correct
37 Correct 508 ms 31880 KB Output is correct
38 Correct 464 ms 31896 KB Output is correct
39 Correct 497 ms 32160 KB Output is correct
40 Correct 541 ms 32092 KB Output is correct
41 Correct 231 ms 32120 KB Output is correct
42 Correct 383 ms 26772 KB Output is correct
43 Correct 395 ms 32144 KB Output is correct
44 Correct 147 ms 13172 KB Output is correct