답안 #957906

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
957906 2024-04-04T13:18:48 Z Der_Vlapos 바이러스 (JOI19_virus) C++17
6 / 100
300 ms 262144 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 = 810 * 810;

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});
							}
					}
				}
		if (r == 800)
			exit(0);

		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:303:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  303 | main()
      | ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 49980 KB Output is correct
2 Runtime error 300 ms 262144 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 49240 KB Output is correct
2 Correct 34 ms 49500 KB Output is correct
3 Correct 61 ms 49580 KB Output is correct
4 Correct 31 ms 49500 KB Output is correct
5 Correct 69 ms 49488 KB Output is correct
6 Correct 79 ms 56312 KB Output is correct
7 Correct 26 ms 49244 KB Output is correct
8 Correct 58 ms 49560 KB Output is correct
9 Correct 39 ms 52812 KB Output is correct
10 Correct 33 ms 49676 KB Output is correct
11 Correct 29 ms 52824 KB Output is correct
12 Correct 39 ms 54608 KB Output is correct
13 Correct 63 ms 54260 KB Output is correct
14 Correct 63 ms 54256 KB Output is correct
15 Correct 63 ms 56616 KB Output is correct
16 Correct 65 ms 54000 KB Output is correct
17 Correct 48 ms 52724 KB Output is correct
18 Correct 34 ms 53316 KB Output is correct
19 Correct 67 ms 49980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 31 ms 49980 KB Output is correct
2 Runtime error 300 ms 262144 KB Execution killed with signal 9
3 Halted 0 ms 0 KB -