답안 #242662

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
242662 2020-06-28T20:11:36 Z johutha 열대 식물원 (Tropical Garden) (IOI11_garden) C++17
69 / 100
5000 ms 54712 KB
#include "garden.h"
#include "gardenlib.h"
#include <vector>
#include <iostream>

using namespace std;

struct graph
{
	int n;
	int h;
	vector<vector<int>> adjlist;
	vector<vector<int>> best;
	vector<int> dist;
	vector<bool> cycle;
	int cyc = 2e9;
	int p;

	void add(int fr, int to)
	{
		int t = to;
		if (fr == best[to][0]) t += h;
		if (best[fr][0] == to)
		{
			adjlist[fr].push_back(t);
		}
		if (best[fr][1] == to)
		{
			adjlist[fr + h].push_back(t);
		}
	}

	graph(int in, int m, vector<vector<int>> ib, int R[][2]) : n(2*in), h(in), adjlist(vector<vector<int>>(2*n)), best(ib), dist(n, -1), cycle(n)
	{
		for (int i = 0; i < m; i++)
		{
			add(R[i][0], R[i][1]);
			add(R[i][1], R[i][0]);
		}
	}

	void print()
	{
		cout << n << "\n";

		for (int i = 0; i < n; i++)
		{
			for (auto j : adjlist[i])
			{
				cout << i << " " << j << "\n";
			}
		}
	}

	void reverse()
	{
		vector<vector<int>> old(n);
		swap(old, adjlist);

		for (int i = 0; i < n; i++)
		{
			for (int j : old[i])
			{
				adjlist[j].push_back(i);
			}
		}
	}

	bool dfs(int curr, int d)
	{
		if (curr == p && dist[curr] != -1)
		{
			cyc = d;
			return true;
		}
		dist[curr] = d;

		for (auto next : adjlist[curr])
		{
			if (dfs(next, d + 1)) cycle[curr] = true;
		}

		return cycle[curr];
	}
	
	void calc(int P)
	{
		p = P;
		dfs(p, 0);
	}

	void pcyc()
	{
		cout << "Cycle: " << cyc << "\n";
		for (int i = 0; i < n; i++)
		{
			cout << (i % h);
			if (i >= h) cout << "*";
			else cout << " ";
			cout << ": ";
			cout << cycle[i] << "   " << dist[i] << "\n";
		}
	}

	bool check(int v, int t)
	{
		if (t < dist[v]) return false;
		if (t % cyc != dist[v] % cyc) return false;
		return true;
	}
};

void count_routes(int n, int m, int P, int R[][2], int Q, int G[])
{
	vector<vector<int>> best(n, vector<int>(2, -1));

	auto ins = [&](int k, int v)
	{
		swap(best[k][0], best[k][1]);
		best[k][0] = v;
	};

	for (int i = m - 1; i >= 0; i--)
	{
		ins(R[i][0], R[i][1]);
		ins(R[i][1], R[i][0]);
	}

	for (int i = 0; i < n; i++) if (best[i][1] == -1) best[i][1] = best[i][0];

	graph g(n, m, best, R);
	g.reverse();
	graph g2(g);
	g.calc(P);
	g2.calc(P + n);
	
	for (int c = 0; c < Q; c++)
	{
		int v = G[c];
		int r = 0;

		for (int i = 0; i < n; i++)
		{
			r += g.check(i, v);
			r += g2.check(i, v);
		}
		answer(r);
	}
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 768 KB Output is correct
2 Correct 5 ms 768 KB Output is correct
3 Correct 6 ms 768 KB Output is correct
4 Correct 4 ms 384 KB Output is correct
5 Correct 4 ms 384 KB Output is correct
6 Correct 6 ms 896 KB Output is correct
7 Correct 5 ms 384 KB Output is correct
8 Correct 5 ms 640 KB Output is correct
9 Correct 7 ms 768 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 768 KB Output is correct
2 Correct 5 ms 768 KB Output is correct
3 Correct 6 ms 768 KB Output is correct
4 Correct 4 ms 384 KB Output is correct
5 Correct 4 ms 384 KB Output is correct
6 Correct 6 ms 896 KB Output is correct
7 Correct 5 ms 384 KB Output is correct
8 Correct 5 ms 640 KB Output is correct
9 Correct 7 ms 768 KB Output is correct
10 Correct 5 ms 384 KB Output is correct
11 Correct 27 ms 8688 KB Output is correct
12 Correct 54 ms 14240 KB Output is correct
13 Correct 97 ms 43124 KB Output is correct
14 Correct 205 ms 49432 KB Output is correct
15 Correct 239 ms 50040 KB Output is correct
16 Correct 165 ms 34196 KB Output is correct
17 Correct 185 ms 28900 KB Output is correct
18 Correct 53 ms 14228 KB Output is correct
19 Correct 202 ms 49428 KB Output is correct
20 Correct 244 ms 50040 KB Output is correct
21 Correct 184 ms 34196 KB Output is correct
22 Correct 161 ms 28916 KB Output is correct
23 Correct 232 ms 54712 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 768 KB Output is correct
2 Correct 5 ms 768 KB Output is correct
3 Correct 6 ms 768 KB Output is correct
4 Correct 4 ms 384 KB Output is correct
5 Correct 4 ms 384 KB Output is correct
6 Correct 6 ms 896 KB Output is correct
7 Correct 5 ms 384 KB Output is correct
8 Correct 5 ms 640 KB Output is correct
9 Correct 7 ms 768 KB Output is correct
10 Correct 5 ms 384 KB Output is correct
11 Correct 27 ms 8688 KB Output is correct
12 Correct 54 ms 14240 KB Output is correct
13 Correct 97 ms 43124 KB Output is correct
14 Correct 205 ms 49432 KB Output is correct
15 Correct 239 ms 50040 KB Output is correct
16 Correct 165 ms 34196 KB Output is correct
17 Correct 185 ms 28900 KB Output is correct
18 Correct 53 ms 14228 KB Output is correct
19 Correct 202 ms 49428 KB Output is correct
20 Correct 244 ms 50040 KB Output is correct
21 Correct 184 ms 34196 KB Output is correct
22 Correct 161 ms 28916 KB Output is correct
23 Correct 232 ms 54712 KB Output is correct
24 Correct 10 ms 384 KB Output is correct
25 Correct 1103 ms 8716 KB Output is correct
26 Correct 1987 ms 14088 KB Output is correct
27 Correct 4369 ms 43364 KB Output is correct
28 Execution timed out 5052 ms 49432 KB Time limit exceeded
29 Halted 0 ms 0 KB -