Submission #798059

#TimeUsernameProblemLanguageResultExecution timeMemory
798059TheSahibWerewolf (IOI18_werewolf)C++14
0 / 100
1346 ms524288 KiB
#include "werewolf.h" #include <bits/stdc++.h> using namespace std; const int MAX = 2e5 + 5; const int LOGMAX = 17; int n; struct graph{ vector<int> tree[MAX]; int par[LOGMAX][MAX]; bitset<5000> st[MAX]; void dfs(int node, int p){ par[0][node] = p; for(int to:tree[node]){ if(to == p) continue; dfs(to, node); st[node] |= st[to]; } st[node][node] = 1; } void preCalc(){ for (int j = 1; j < LOGMAX; j++) { for (int i = 0; i < n; i++) { par[j][i] = par[j - 1][par[j - 1][i]]; } } } int lift(int v, int a){ bool s = v < a; for(int j = LOGMAX - 1; j >= 0; --j){ int u = par[j][v]; if((s && u <= a) || (!s && u >= a)){ v = u; } } return v; } }; vector<int> g[MAX]; graph tree1, tree2; struct DSU{ int par[MAX]; bool b = 0; void init(int N, bool _b){ b = _b; memset(par, -1, sizeof(par)); } int get(int node){ if(par[node] < 0) return node; return par[node] = get(par[node]); } bool unite(int v, int u){ v = get(v); u = get(u); if(v == u) return false; if(v < u && b) swap(v, u); if(v > u && !b) swap(v, u); par[v] += par[u]; par[u] = v; return true; } }; vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) { n = N; DSU dsu; for (int i = 0; i < X.size(); i++) { g[X[i]].push_back(Y[i]); g[Y[i]].push_back(X[i]); } dsu.init(N, 0); for (int node = N - 1; node >= 0; node--) { for(int to:g[node]){ if(to < node) continue; int a = dsu.get(to); if(dsu.unite(node, to)){ tree1.tree[node].push_back(a); } } } dsu.init(N, 1); for (int node = 0; node < N; node++) { for(int to:g[node]){ if(to > node) continue; int a = dsu.get(to); if(dsu.unite(node, to)){ tree2.tree[node].push_back(a); } } } tree1.dfs(0, 0); tree2.dfs(n - 1, n - 1); tree1.preCalc(); tree2.preCalc(); vector<int> ans(S.size()); for (int i = 0; i < S.size(); i++) { int a = tree1.lift(S[i], L[i]); int b = tree2.lift(E[i], R[i]); ans[i] = (tree1.st[a] & tree2.st[b]).any(); } return ans; }

Compilation message (stderr)

werewolf.cpp: In function 'std::vector<int> check_validity(int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
werewolf.cpp:73:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   73 |     for (int i = 0; i < X.size(); i++)
      |                     ~~^~~~~~~~~~
werewolf.cpp:106:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |     for (int i = 0; i < S.size(); i++)
      |                     ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...