Submission #1031615

#TimeUsernameProblemLanguageResultExecution timeMemory
1031615SamuellH12Bitaro’s Party (JOI18_bitaro)C++17
7 / 100
2054 ms344628 KiB
#include <bits/stdc++.h>
#define ALL(x) x.begin(), x.end()
#define pii pair<int,int>
const int MAXN = 1e5 + 1;
const int SQRT = 316;
using namespace std;

int block[MAXN], dp[MAXN], order[MAXN], tempo;
vector<int> trafo[MAXN];
vector<pii> best[MAXN];
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
int main(){
	ios::sync_with_stdio(false);
	int n, m, q;
	scanf("%d %d %d", &n, &m, &q);
	
	for(int i=0, u, v; i<m; i++)
	{
		scanf("%d %d", &u, &v);
		trafo[v].push_back(u);
		dp[u]++;
	}

	deque<int> fila;
	for(int i=1; i<=n; i++) if(!dp[i]) fila.push_back(i);
	int od = n;
	while(!fila.empty())
	{
		int u = fila.front(); fila.pop_front();
		order[--od] = u;
		shuffle(ALL(trafo[u]), rng);
 
		for(int v : trafo[u])
			if(--dp[v] == 0)
				fila.push_back(v);
	}
	order[n] = -1;

	for(int u : order)
	{
		if(u == -1) break;
        best[u].push_back(pii(0, u));
		for(auto v : trafo[u]){
			for(auto [x, w] : best[v])
				best[u].push_back(pii(x-1, w));
		}
 
		sort(ALL(best[u]));
		best[u].resize(min(SQRT, (int)(unique(ALL(best[u])) - best[u].begin())));
	}
 
	int t, y;
	while(q--)
	{
		tempo++;
		scanf("%d %d", &t, &y);
 
		for(int i=0, x; i<y; i++)
		{
			scanf("%d", &x);
			block[x] = tempo;
		}
 
		int ans = -1;
 
		for(auto [x, w] : best[t]) 
			if(block[w] != tempo)
			{
				ans = -x;
				break;
			}
 
		if(ans == -1) for(int u : order)
		{
			dp[u] = (block[u] == tempo ? -1 : 0);
	
			for(auto v : trafo[u])
				if(~dp[v]) 
					dp[u] = max(dp[u], dp[v]+1);
	
			if(u == t){ ans = dp[u]; break; }
		}
		
		printf("%d\n", ans);
	}
 
	return 0;	
}

Compilation message (stderr)

bitaro.cpp: In function 'int main()':
bitaro.cpp:16:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   16 |  scanf("%d %d %d", &n, &m, &q);
      |  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:20:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |   scanf("%d %d", &u, &v);
      |   ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:57:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |   scanf("%d %d", &t, &y);
      |   ~~~~~^~~~~~~~~~~~~~~~~
bitaro.cpp:61:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |    scanf("%d", &x);
      |    ~~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...