Submission #1307544

#TimeUsernameProblemLanguageResultExecution timeMemory
1307544marcogambaroTropical Garden (IOI11_garden)C++20
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
using namespace std;
std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define readv(v) do { for(auto &i: v) cin >> i; } while(0)
#define writev(v) do { for(auto i: v) cout << i << " "; } while(0)
#define _ << " " <<
#define ll long long
#define u64 unsigned long long
#ifndef MARCO
bool dbg = 0;
#define info(str, ...)
#define infon(str, ...)
#else
bool dbg = 1;
#define info(str, ...) do { fprintf(stderr, "\033[31m" str "\033[0m", ##__VA_ARGS__); } while(0)
#define infon(str, ...) do { fprintf(stderr, "\033[31m" str "\033[0m\n", ##__VA_ARGS__); } while(0)
#endif
constexpr int LOG = 30;

#define int long long

struct cycle{
	ll T, q; //ans = q + k*T

	bool operator==(const cycle &o) const {
		return (T == o.T) & (q == o.q);
	}
};
cycle lost = {-1, -1};

int N, P, Q;
vector<cycle> rgood, rbad; //risposta se arrivo in quel nodo dall'arco più bello o no
vector<int> onegood, onebad;
vector<int> G1, G2;

vector<int> statgood, statbad; //0 = mai visto, >0 = in esecuzione, -1 = finito 

int esplorabad(int a, int b, int c);
int esploragood(int a, int b, int c);

int esplorabad(int n, int k, int seenP) {
	if(n == P)	seenP = 0;
	if(statbad[n] == -1) return 0;
	if(statbad[n] > 0) {
		//il ciclo ha lunghezza k-statbad[n]
		if(seenP < 0)	rbad[n] = lost;
		else 			rbad[n] = {k - statbad[n], k - statbad[n] - seenP};
		statbad[n] = -1;
		return 1;
	}
	
	statbad[n] = k;
	int n2 = G2[n];
	if(n == G1[n2] && G2[n2] != -1) {
		int rtn;
		if(esplorabad(n2, k+1, seenP+1) == 0) { //fuori da un ciclo
			if(rbad[n2] == lost) 	rbad[n] = lost;
			else 					rbad[n] = {rbad[n2].T, rbad[n2].q+1};
			statbad[n] = -1;
			rtn = 0;
		}
		else { //dentro un ciclo
			rtn = 1;
			if(statbad[n] == -1) 		rtn = 0; //fine del ciclo
			else if(rbad[n2] == lost) 	rbad[n] = lost;
			else						rbad[n] = {rbad[n2].T, (rbad[n2].q+1)%rbad[n2].T};
			statbad[n] = -1;
		}

		if(seenP == 0) 	onebad[n] = 0;
		else			onebad[n] = onebad[n2]+1;
		return rtn;
	}
	else {
		int rtn;
		if(esploragood(n2, k+1, seenP+1) == 0) { //fuori da un ciclo
			if(rgood[n2] == lost) 	rbad[n] = lost;
			else 					rbad[n] = {rgood[n2].T, rgood[n2].q+1};
			statbad[n] = -1;
			rtn = 0;
		}
		else { //dentro un ciclo
			rtn = 1;
			if(statbad[n] == -1) 		rtn = 0; //fine del ciclo
			else if(rbad[n2] == lost) 	rbad[n] = lost;
			else						rbad[n] = {rgood[n2].T, (rgood[n2].q+1)%rgood[n2].T};
			statbad[n] = -1;
		}

		if(seenP == 0) 	onebad[n] = 0;
		else			onebad[n] = onegood[n2]+1;
		return rtn;
	}
}

int esploragood(int n, int k, int seenP) {
	if(n == P)	seenP = 0;
	if(statgood[n] == -1) return 0;
	if(statgood[n] > 0) {
		//il ciclo ha lunghezza k-statgood[n]
		if(seenP < 0)	rgood[n] = lost;
		else 			rgood[n] = {k - statgood[n], k - statgood[n] - seenP};
		statgood[n] = -1;
		return 1;
	}
	
	statgood[n] = k;
	int n2 = G1[n];
	if(n == G1[n2] && G2[n2] != -1) {
		int rtn;
		if(esplorabad(n2, k+1, seenP+1) == 0) { //fuori da un ciclo
			if(rbad[n2] == lost) 	rgood[n] = lost;
			else 					rgood[n] = {rbad[n2].T, rbad[n2].q+1};
			statgood[n] = -1;
			rtn = 0;
		}
		else { //dentro un ciclo
			rtn = 1;
			if(statgood[n] == -1) 		rtn = 0; //fine del ciclo
			else if(rbad[n2] == lost) 	rgood[n] = lost;
			else						rgood[n] = {rbad[n2].T, (rbad[n2].q+1)%rbad[n2].T};
			statgood[n] = -1;
		}

		if(seenP == 0) 	onegood[n] = 0;
		else 			onegood[n] = onebad[n2]+1;
		return rtn;
	}
	else {
		int rtn;
		if(esploragood(n2, k+1, seenP+1) == 0) { //fuori da un ciclo
			if(rgood[n2] == lost) 	rgood[n] = lost;
			else 					rgood[n] = {rgood[n2].T, rgood[n2].q+1};
			statgood[n] = -1;
			rtn = 0;
		}
		else { //dentro un ciclo
			rtn = 1;
			if(statgood[n] == -1) 		rtn = 0; //fine del ciclo
			else if(rbad[n2] == lost) 	rgood[n] = lost;
			else						rgood[n] = {rgood[n2].T, (rgood[n2].q+1)%rgood[n2].T};
			statgood[n] = -1;
		}

		if(seenP == 0) 	onegood[n] = 0;
		else 			onegood[n] = onegood[n2]+1;
		return rtn;
	}
}


signed main(){	
	#ifndef MARCO
	ios::sync_with_stdio(false);
	cin.tie(nullptr); 
	ifstream cin("input.txt");
	ofstream cout("output.txt");
	#endif  
    
	int M; 
    cin >> N >> M >> P;
    G1.resize(N, -1);
	G2.resize(N, -1);

	for(int i=0; i<M; i++) {
		int a, b; cin >> a >> b;
		if(G1[a] == -1) 		G1[a] = b;
		else if(G2[a] == -1) 	G2[a] = b;
		swap(a, b);
		if(G1[a] == -1) 		G1[a] = b;
		else if(G2[a] == -1) 	G2[a] = b;
	}
    
	rgood.resize(N);
	rbad.resize(N);
	statgood.resize(N);
	statbad.resize(N);
	onegood.resize(N, -1e9);
	onebad.resize(N, -1e9);

	for(int i=N-1; i>=0; i--) {
		esploragood(i, 1, -1e9);
	}

	if(dbg) {
		infon("\ndebugging...");
		infon("rgood:");
		info("T: "); for(int i=0; i<N; i++) cout << rgood[i].T << " "; cout << "\n";
		info("q: "); for(int i=0; i<N; i++) cout << rgood[i].q << " "; cout << "\n";
		infon("rbad:");
		info("T: "); for(int i=0; i<N; i++) cout << rbad[i].T << " "; cout << "\n";
		info("q: "); for(int i=0; i<N; i++) cout << rbad[i].q << " "; cout << "\n";
		infon("onegood: ");
		for(int i: onegood) cout << i << " "; cout << "\n";
		infon("onebad: ");
		for(int i: onebad) cout << i << " "; cout << "\n";
	}

	int Q; cin >> Q;
	while(Q--) {
		ll x; cin >> x;
		int ans = 0;

		int i=-1;
		for(auto &[T, q]: rgood) {
			i++;
			if(onegood[i] == x) {
				ans++;
				continue;
			}
			if(T <= 0) continue;

			if(x-q >= 0 && (x-q)%T == 0) ans++;
		}

		cout << ans << "\n";
	}


}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccZvO3F3.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccxnMbFZ.o:garden.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccZvO3F3.o: in function `main':
grader.cpp:(.text.startup+0x3f): undefined reference to `count_routes(int, int, int, int (*) [2], int, int*)'
collect2: error: ld returned 1 exit status