Submission #116929

#TimeUsernameProblemLanguageResultExecution timeMemory
116929pzdbaWerewolf (IOI18_werewolf)C++14
100 / 100
1390 ms147592 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int, int> pii; typedef pair<int, pii> pipii; vector<int> g[200005], g2[200005], g3[200005]; int par2[19][200005], par3[19][200005]; int p[200005]; int mapp[200005]; int sz[200005]; int root(int a){ return p[a] == a?a:(p[a]=root(p[a])); } void merge(int a, int b, int t){ a = root(a), b = root(b); if(a != b){ p[a] = b; if(t == 0) sz[b] = min(sz[b], sz[a]); else sz[b] = max(sz[b], sz[a]); } } int arr2[200005], arr3[200005], j = 1; int s2[200005], e2[200005], s3[200005], e3[200005]; void dfs2(int u, int p){ arr2[j++] = u; par2[0][u] = p; s2[u] = j-1; for(int i=0;i<g2[u].size();i++){ int v = g2[u][i]; dfs2(v, u); } e2[u] = j-1; } void dfs3(int u, int p){ arr3[j++] = u; par3[0][u] = p; s3[u] = j-1; for(int i=0;i<g3[u].size();i++){ int v = g3[u][i]; dfs3(v, u); } e3[u] = j-1; } set<int> dp[200005]; set<int>::iterator its; vector<pipii> cur[200005]; vector<int> ans; void dfs(int u, int p){ dp[u].insert(mapp[u]); for(int i=0;i<g3[u].size();i++){ int v = g3[u][i]; dfs(v, u); if(dp[u].size() < dp[v].size()) swap(dp[u], dp[v]); for(its = dp[v].begin();its != dp[v].end();its++) dp[u].insert(*its); } for(int i=0;i<cur[u].size();i++){ int j = cur[u][i].first; int l = cur[u][i].second.first, r = cur[u][i].second.second; its = dp[u].lower_bound(l); if(l <= *its && *its <= r) ans[j] = 1; else ans[j] = 0; } } std::vector<int> check_validity(int N, std::vector<int> X, std::vector<int> Y, std::vector<int> S, std::vector<int> E, std::vector<int> L, std::vector<int> R){ int n = N; int m = X.size(); int q = S.size(); ans.resize(q); for(int i=0;i<m;i++){ int a, b; a = X[i]+1, b = Y[i]+1; g[a].push_back(b); g[b].push_back(a); } for(int i=1;i<=n;i++) p[i] = i, sz[i] = i; for(int i=n;i>=1;i--){ for(int j=0;j<g[i].size();j++){ int v = g[i][j]; if(v >= i){ if(root(i) != root(v)){ int r = root(v); g2[i].push_back(sz[r]); } merge(i, v, 0); } } } for(int i=1;i<=n;i++) p[i] = i, sz[i] = i; for(int i=1;i<=n;i++){ for(int j=0;j<g[i].size();j++){ int v = g[i][j]; if(v <= i){ if(root(i) != root(v)){ int r = root(v); g3[i].push_back(sz[r]); } merge(i, v, 1); } } } j = 1; dfs2(1, 0); // human j = 1; dfs3(n, 0); // wolf j--; for(int i=1;i<=n;i++){ mapp[arr2[i]] = i; } for(int j=1;j<=18;j++){ for(int i=1;i<=n;i++){ if(par2[j-1][i] != 0) par2[j][i] = par2[j-1][par2[j-1][i]]; if(par3[j-1][i] != 0) par3[j][i] = par3[j-1][par3[j-1][i]]; } } for(int i=0;i<q;i++){ int s, e, l, r; s = S[i]+1, e = E[i]+1, l = L[i]+1, r = R[i]+1; for(int j=18;j>=0;j--){ if(par2[j][s] != 0 && par2[j][s] >= l) s = par2[j][s]; if(par3[j][e] != 0 && par3[j][e] <= r) e = par3[j][e]; } int ll = s2[s], rr = e2[s]; cur[e].push_back(pipii(i, pii(ll, rr))); } dfs(n, 0); return ans; }

Compilation message (stderr)

werewolf.cpp: In function 'void dfs2(int, int)':
werewolf.cpp:27:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g2[u].size();i++){
                 ~^~~~~~~~~~~~~
werewolf.cpp: In function 'void dfs3(int, int)':
werewolf.cpp:37:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g3[u].size();i++){
                 ~^~~~~~~~~~~~~
werewolf.cpp: In function 'void dfs(int, int)':
werewolf.cpp:50:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<g3[u].size();i++){
                 ~^~~~~~~~~~~~~
werewolf.cpp:56:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<cur[u].size();i++){
                 ~^~~~~~~~~~~~~~
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:78:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j=0;j<g[i].size();j++){
                     ~^~~~~~~~~~~~
werewolf.cpp:91:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j=0;j<g[i].size();j++){
                     ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...