Submission #534943

#TimeUsernameProblemLanguageResultExecution timeMemory
534943shrimb열대 식물원 (Tropical Garden) (IOI11_garden)C++17
69 / 100
5039 ms41976 KiB
#include "garden.h"
#include "gardenlib.h"
#include"bits/stdc++.h"
using namespace std;

int nxt[150001][2];
int dp[150001][2][32];


void count_routes(int N, int M, int P, int R[][2], int Q, int G[]) {
	for (int i = 0 ; i < M ; i++) {
		auto [u, v] = R[i];
		u++, v++;
		if (!nxt[u][0] and !nxt[v][0]) {
			nxt[u][0] = -v;
			nxt[v][0] = -u;
		}
		if (!nxt[u][0]) nxt[u][0] = v;
		if (!nxt[v][0]) nxt[v][0] = u;

		if (abs(nxt[u][0]) != v and nxt[u][1] == 0) {
			if (abs(nxt[v][0]) == u) nxt[u][1] = -v;
			else nxt[u][1] = v;
		}

		if (abs(nxt[v][0]) != u and nxt[v][1] == 0) {
			if (abs(nxt[u][0]) == v) nxt[v][1] = -u;
			else nxt[v][1] = u;
		}
	}

	for (int i = 1 ; i <= N ; i++) {
		if (nxt[i][1] == 0) nxt[i][1] = nxt[i][0];
	}

	// for (int i = 1 ; i <= N ; i++) {
	// 	cout << i << ": " << nxt[i][0] << " " << nxt[i][1] << endl;
	// }

	for (int j = 0 ; j < 32 ; j++) {
		for (int i = 1 ; i <= N ; i++) {
			for (int k = 0 ; k < 2 ; k++) {
				if (j == 0) {
					dp[i][k][j] = nxt[i][k];
				} else {
					int x = dp[i][k][j-1];
					int u = abs(x);
					int v = x < 0;
					dp[i][k][j] = dp[u][v][j-1];
				}
			}
		}
	}

	for (int q = 0 ; q < Q ; q++) {
		int k = G[q];
		int ans = 0;
		for (int i = 1 ; i <= N ; i++) {
			int u = i, v = 0;
			for (int j = 31 ; j >= 0 ; j--) {
				if (k & (1 << j)) {
					int x = dp[u][v][j];
					u = abs(x);
					v = x < 0;
				}
			}
			// cerr << q << ": " << i << " " << u << endl;
			if (u == P + 1) {
				ans++;
			}
		}
		answer(ans);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...