Submission #1029751

#TimeUsernameProblemLanguageResultExecution timeMemory
1029751parsadox2Werewolf (IOI18_werewolf)C++17
34 / 100
1897 ms38596 KiB
#include <bits/stdc++.h> #include "werewolf.h" using namespace std; const int N = 2e5 + 10; int n , m , q , pos[N]; vector <int> adj[N] , vec; struct SEG{ int mn[N << 2] , mx[N << 2]; void Build(int node = 1 , int nl = 0 , int nr = n) { if(nr - nl == 1) { mn[node] = mx[node] = vec[nl]; return; } int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1; Build(lc , nl , mid); Build(rc , mid , nr); mn[node] = min(mn[lc] , mn[rc]); mx[node] = max(mx[lc] , mx[rc]); } int Getmn(int l , int r , int node = 1 , int nl = 0 , int nr = n) { if(nr <= l || r <= nl) return n; if(l <= nl && nr <= r) return mn[node]; int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1; return min(Getmn(l , r , lc , nl , mid) , Getmn(l , r , rc , mid , nr)); } int Getmx(int l , int r , int node = 1 , int nl = 0 , int nr = n) { if(nr <= l || r <= nl) return 0; if(l <= nl && nr <= r) return mx[node]; int mid = (nl + nr) >> 1 , lc = node << 1 , rc = lc | 1; return max(Getmx(l , r , lc , nl , mid) , Getmx(l , r , rc , mid , nr)); } } seg; pair<int , int> Getst(int id , int val) { pair<int , int> res; int low = -1 , high = id; while(high - low > 1) { int mid = (low + high) >> 1; if(seg.Getmn(mid , id + 1) >= val) high = mid; else low = mid; } res.first = high; low = id; high = n; while(high - low > 1) { int mid = (low + high) >> 1; if(seg.Getmn(id , mid + 1) >= val) low = mid; else high = mid; } res.second = low; return res; } pair<int , int> Getfn(int id , int val) { pair<int , int> res; int low = -1 , high = id; while(high - low > 1) { int mid = (low + high) >> 1; if(seg.Getmx(mid , id + 1) <= val) high = mid; else low = mid; } res.first = high; low = id; high = n; while(high - low > 1) { int mid = (low + high) >> 1; if(seg.Getmx(id , mid + 1) <= val) low = mid; else high = mid; } res.second = low; return res; } vector <int> check_validity(int nn , vector <int> X , vector <int> Y , vector <int> S , vector <int> E , vector <int> L , vector <int> R ) { vector <int> res; n = nn; m = X.size(); q = S.size(); for(int i = 0 ; i < m ; i++) { adj[X[i]].push_back(Y[i]); adj[Y[i]].push_back(X[i]); } for(int i = 0 ; i < n ; i++) if(adj[i].size() == 1) { vec.push_back(i); vec.push_back(adj[i][0]); break; } while(vec.size() < n) { if(adj[vec.back()][0] == vec[vec.size() - 2]) vec.push_back(adj[vec.back()][1]); else vec.push_back(adj[vec.back()][0]); } for(int i = 0 ; i < n ; i++) pos[vec[i]] = i; seg.Build(); for(int i = 0 ; i < q ; i++) { pair<int ,int> a = Getst(pos[S[i]] , L[i]) , b = Getfn(pos[E[i]] , R[i]); bool flg = true; if(a.second < b.first || b.second < a.first) flg = false; res.push_back(flg); } return res; }

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:114:19: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  114 |  while(vec.size() < n)
      |        ~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...