Submission #957904

# Submission time Handle Problem Language Result Execution time Memory
957904 2024-04-04T13:16:22 Z Der_Vlapos Virus Experiment (JOI19_virus) C++17
6 / 100
51 ms 8688 KB
// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #include <x86intrin.h>

#include <bits/stdc++.h>
#include <chrono>
#include <random>

// @author: Vlapos

namespace operators
{
	template <typename T1, typename T2>
	std::istream &operator>>(std::istream &in, std::pair<T1, T2> &x)
	{
		in >> x.first >> x.second;
		return in;
	}

	template <typename T1, typename T2>
	std::ostream &operator<<(std::ostream &out, std::pair<T1, T2> x)
	{
		out << x.first << " " << x.second;
		return out;
	}

	template <typename T1>
	std::istream &operator>>(std::istream &in, std::vector<T1> &x)
	{
		for (auto &i : x)
			in >> i;
		return in;
	}

	template <typename T1>
	std::ostream &operator<<(std::ostream &out, std::vector<T1> &x)
	{
		for (auto &i : x)
			out << i << " ";
		return out;
	}

	template <typename T1>
	std::ostream &operator<<(std::ostream &out, std::set<T1> &x)
	{
		for (auto &i : x)
			out << i << " ";
		return out;
	}
}

// name spaces
using namespace std;
using namespace operators;
// end of name spaces

// defines
#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define f first
#define s second
#define uint unsigned int
#define all(vc) vc.begin(), vc.end()
// end of defines

// usefull stuff

void boost()
{
	ios_base ::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
}

inline int getbit(int &x, int &bt) { return (x >> bt) & 1; }

const int dx4[4] = {-1, 0, 0, 1};
const int dy4[4] = {0, -1, 1, 0};
const int dx8[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int dy8[8] = {-1, -0, 1, -1, 1, -1, 0, 1};

const ll INF = (1e18) + 500;
const int BIG = (1e9) * 2 + 100;
const int MAXN = (1e5) + 5;
const int MOD7 = (1e9) + 7;
const int MOD9 = (1e9) + 9;
const uint MODFFT = 998244353;

// #define int ll

const int maxN = 100 * 100;

vector<pair<vector<int>, int>> rules[maxN];

struct DSU
{
	map<int, bool> is[maxN];
	int pr[maxN];

	void init(int n)
	{
		for (int i = 0; i < n; ++i)
		{
			pr[i] = i;
			is[i][i];
		}
	}

	int getRoot(int c)
	{
		return pr[c] == c ? c : pr[c] = getRoot(pr[c]);
	}
};

struct test
{
	int m, r, c;

	bool good(int x, int y)
	{
		return x >= 0 and y >= 0 and x < r and y < c;
	}
	vector<int> tin, fup;
	DSU dsu;

	int ans = BIG, cnt = 0;
	int timer = 0;

	bool dfs(int v)
	{
		tin[v] = fup[v] = ++timer;
		queue<int> toV;
		for (auto &[nd, to] : rules[v])
			if (nd.size() == 1)
				toV.push(to);

		bool isGood = true;
		while (toV.size())
		{
			int to = toV.front();
			to = dsu.getRoot(to);
			toV.pop();
			if (dsu.getRoot(to) == dsu.getRoot(v))
				continue;
			// cout << v << " -> " << to << '\n';
			if (!tin[to])
			{
				isGood &= dfs(to);
				fup[v] = min(fup[v], fup[to]);
				if (fup[to] <= tin[v])
				{
					assert(dsu.getRoot(to) == to);
					assert(dsu.getRoot(v) == v);
					// merge prev and cur
					// cout << "merging" << v << " " << to << '\n';
					if (dsu.is[v].size() < dsu.is[to].size())
						swap(dsu.is[v], dsu.is[to]);

					for (auto &[el, bf] : dsu.is[to])
						for (auto &[els, newTo] : rules[el])
						{
							int cnt1 = 0, cnt2 = 0;
							for (int WTF : els)
								if (dsu.is[to].find(WTF) != dsu.is[to].end())
									cnt1++;
								else if (dsu.is[v].find(WTF) != dsu.is[v].end())
									cnt2++;
							if (cnt1 and cnt2 and cnt1 + cnt2 == els.size() and dsu.getRoot(newTo) != v)
								toV.push(newTo);
						}

					for (auto &[el, bf] : dsu.is[to])
						dsu.is[v][el];
					dsu.pr[to] = v;
					dsu.is[to].clear();
				}
				else
					isGood = false;
			}
			else if (tin[v] > tin[to])
			{
				fup[v] = min(tin[to], fup[v]);
			}
			else
				isGood = false;
		}

		if (tin[v] == fup[v] and isGood)
		{
			assert(dsu.getRoot(v) == v);
			int VAL = (int)dsu.is[v].size();
			if (ans > VAL)
			{
				ans = VAL;
				cnt = VAL;
			}
			else if (ans == VAL)
			{
				cnt += VAL;
			}
		}
		tin[v] = BIG;
		return isGood;
	}

	void solve(int testcase)
	{
		boost();

		cin >> m >> r >> c;

		dsu.init(r * c);
		tin.resize(r * c);
		fup.resize(r * c);
		string s;
		cin >> s;
		s = s + s;
		m *= 2;

		// const int dx4[4] = {-1, 0, 0, 1};
		// const int dy4[4] = {0, -1, 1, 0};
		map<char, int> dist;
		dist['N'] = 0;
		dist['W'] = 1;
		dist['E'] = 2;
		dist['S'] = 3;

		vector<int> longest(1 << 4);
		for (int i = 1; i < (1 << 4); ++i)
		{
			int cnt = 0, cur = 0;
			for (int j = 0; j < m; ++j)
			{
				if ((i >> (dist[s[j]])) & 1)
					cur++;
				else
					cur = 0;
				cnt = max(cnt, cur);
			}
			if (cnt == m)
				longest[i] = BIG;
			else
				longest[i] = cnt;
		}

		vector<vector<int>> u(r, vector<int>(c));
		cin >> u;
		for (int i = 0; i < r; ++i)
			for (int j = 0; j < c; ++j)
				if (!u[i][j])
					u[i][j] = BIG + 10;

		for (int i = 0; i < r; ++i)
			for (int j = 0; j < c; ++j)
				for (int mask = 0; mask < (1 << 4); ++mask)
				{
					bool cur = true;
					for (int val = 0; val < 4; ++val)
					{
						int tox = i + dx4[val];
						int toy = j + dy4[val];
						cur &= (good(tox, toy) or !((mask >> val) & 1));
					}
					if (cur and u[i][j] <= longest[mask])
					{
						vector<int> els;
						for (int val = 0; val < 4; ++val)
							if ((mask >> val) & 1)
							{
								int tox = i + dx4[val];
								int toy = j + dy4[val];
								els.pb(tox * c + toy);
							}
						// cerr << mask << " " << longest[mask] << " | " << els << " -> " << mp(i, j) << "\n";
						for (int val = 0; val < 4; ++val)
							if ((mask >> val) & 1)
							{
								int tox = i + dx4[val];
								int toy = j + dy4[val];
								rules[tox * c + toy].pb({els, i * c + j});
							}
					}
				}

		for (int i = 0; i < r; ++i)
			for (int j = 0; j < c; ++j)
				if (!tin[i * c + j] and u[i][j] != BIG + 10)
					dfs(i * c + j);
		if (ans == BIG)
			ans = 0, cnt = 0;

		cout << ans << '\n'
			 << cnt << '\n';
	}
};

main()
{
	boost();
	int q = 1;
	// cin >> q;
	for (int i = 0; i < q; i++)
	{
		test t;
		t.solve(i);
	}
	return 0;
}
//[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]//
//                                                                                    //
//                               Coded by Der_Vlἀpos                                  //
//                                                                                    //
//[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]//

Compilation message

virus.cpp: In member function 'bool test::dfs(int)':
virus.cpp:172:42: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  172 |        if (cnt1 and cnt2 and cnt1 + cnt2 == els.size() and dsu.getRoot(newTo) != v)
      |                              ~~~~~~~~~~~~^~~~~~~~~~~~~
virus.cpp: At global scope:
virus.cpp:301:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  301 | main()
      | ^~~~
# Verdict Execution time Memory Grader output
1 Correct 10 ms 2044 KB Output is correct
2 Runtime error 2 ms 2908 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 1116 KB Output is correct
2 Correct 13 ms 1624 KB Output is correct
3 Correct 40 ms 1628 KB Output is correct
4 Correct 11 ms 1628 KB Output is correct
5 Correct 39 ms 1368 KB Output is correct
6 Correct 51 ms 8324 KB Output is correct
7 Correct 1 ms 1368 KB Output is correct
8 Correct 41 ms 1628 KB Output is correct
9 Correct 16 ms 4952 KB Output is correct
10 Correct 14 ms 1532 KB Output is correct
11 Correct 8 ms 4956 KB Output is correct
12 Correct 18 ms 6832 KB Output is correct
13 Correct 41 ms 6388 KB Output is correct
14 Correct 46 ms 6384 KB Output is correct
15 Correct 42 ms 8688 KB Output is correct
16 Correct 46 ms 6136 KB Output is correct
17 Correct 25 ms 4700 KB Output is correct
18 Correct 11 ms 5468 KB Output is correct
19 Correct 42 ms 2032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 2044 KB Output is correct
2 Runtime error 2 ms 2908 KB Execution killed with signal 11
3 Halted 0 ms 0 KB -