Submission #1317128

#TimeUsernameProblemLanguageResultExecution timeMemory
1317128nikaa123Comparing Plants (IOI20_plants)C++20
0 / 100
3 ms5192 KiB
#include <bits/stdc++.h>
#include "plants.h"
using namespace std;

int n;
vector <vector<int>> v(200005);
vector <bitset<200005>> b(200005,0); 

void init(int k, std::vector<int> r) {
	n = r.size();
	for (int i = 0; i < n; i++) {
		if (r[i] == 0) {
			for (int j = i+1; j <= i+k-1; j++) {
				int id = j%n;
				v[i].emplace_back(id);
			}
		} else {
			for (int j = i+1; j <= i+k-1; j++) {
				int id = j%n;
				v[id].emplace_back(i);
			}
		}
	}
	auto toposort = [](int n, vector <vector<int>>& v) {
		vector <int> indeg(n+5,0);
		for (int i = 0; i < n; i++) {
			for (auto to:v[i]) {
				indeg[to]++;
			}
		}
		queue <int> q;
		for (int i = 0; i < n; i++) {
			if (indeg[i] == 0) {
				q.push(i);
			}
		}
		vector <int> res;
		while (!q.empty()) {
			int f = q.front();
			q.pop();
			res.emplace_back(f);
			for (auto to:v[f]) {
				if (--indeg[to] == 0) {
					q.push(to);
				}
			}
		}
		reverse(res.begin(),res.end());
		return res;
	};

	vector <int> res = toposort(n,v);
	for (int i1 = 0; i1 < res.size(); i1++) {
		int i = res[i1];
		b[i].set(i);
		for (auto to:v[i]) {
			b[i] |= b[to];
		}
	}
}

int compare_plants(int x, int y) {
	if (b[x][y] == 1) {
		return 1;
	}
	if (b[y][x] == 1) {
		return -1;
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...