Submission #479701

#TimeUsernameProblemLanguageResultExecution timeMemory
479701MilosMilutinovicBitaro’s Party (JOI18_bitaro)C++14
0 / 100
7 ms7628 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5;
const int M = 1000;

vector<int> g[N], rg[N];
vector<pair<int, int>> all[N];
bool can[N];
int qId[N], dp[N];
bool taken[N];

void combine(int u, int v) {
	int x = all[u].size() - 1, y = all[v].size() - 1;
	vector<pair<int, int>> edg;
	while (x >= 0 || y >= 0) {
		if (edg.size() > M) break;
		if (x >= 0 && taken[all[u][x].second]) {
			x--;
			continue;
		}
		if (y >= 0 && taken[all[v][y].second]) {
			y--;
			continue;
		}
		if (y < 0 || (x >= 0 && all[u][x].first > all[v][y].first + 1)) {
			edg.push_back({all[u][x].first, all[u][x].second});
			taken[all[u][x].second] = true;
			x--;
		} else {
			edg.push_back({all[v][y].first + 1, all[v][y].second});
			taken[all[v][y].second] = true;
			y--;
		}
	}
	for (int i = 0; i < edg.size(); i++) {
		taken[edg[i].second] = false;
	}
	all[u] = edg;
}

void dfs1(int u) {
	for (int v : rg[u]) {
		dp[v] = max(dp[v], dp[u] + 1);
	}
	for (int v : rg[u]) {
		dfs1(v);
	}
}

int main()
{
	int n, m, q;
	scanf("%d%d%d", &n, &m, &q);
	for (int i = 1; i <= m; i++) {
		int u, v;
		scanf("%d%d", &u, &v);
		--u; --v;
		g[u].push_back(v);
		rg[v].push_back(u);
	}
	for (int i = 0; i < n; i++) {
		taken[i] = false;
	}
	for (int u = 0; u < n; u++) {
		all[u].push_back({0, u});
		for (int v : rg[u]) {
			combine(u, v);
		}
	}
	for (int i = 0; i < n; i++) can[i] = true;
	for (int i = 0; i < n; i++) sort(g[i].begin(), g[i].end());
	for (int i = 0; i < n; i++) sort(rg[i].rbegin(), rg[i].rend());
	while (q--) {
		int st, qSz;
		scanf("%d%d", &st, &qSz);
		--st;
		for (int i = 0; i < qSz; i++) {
			scanf("%d", &qId[i]);
			--qId[i];
			can[qId[i]] = false;
		}

		if (qSz > M) {
			for (int i = 0; i < n; i++) dp[i] = 0;
			dfs1(st);
			int ans = -1;
			for (int i = 0; i < n; i++) {
				if (can[i]) ans = max(ans, dp[i]);
				else can[i] = true;
			}
			printf("%d\n", ans);
		} else {
			int ans = -1;
			for (auto d : all[st]) {
				if (can[d.second]) {
					ans = max(ans, d.first);
				}
			}
			for (int i = 0; i < qSz; i++) can[qId[i]] = true;
			printf("%d\n", ans);
		}
	}
	return 0;
}

Compilation message (stderr)

bitaro.cpp: In function 'void combine(int, int)':
bitaro.cpp:37:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   37 |  for (int i = 0; i < edg.size(); i++) {
      |                  ~~^~~~~~~~~~~~
bitaro.cpp: In function 'int main()':
bitaro.cpp:55:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |  scanf("%d%d%d", &n, &m, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:58:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   58 |   scanf("%d%d", &u, &v);
      |   ~~~~~^~~~~~~~~~~~~~~~
bitaro.cpp:77:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |   scanf("%d%d", &st, &qSz);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~
bitaro.cpp:80:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   80 |    scanf("%d", &qId[i]);
      |    ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...