Submission #622988

#TimeUsernameProblemLanguageResultExecution timeMemory
622988LoboGame (APIO22_game)C++17
100 / 100
2792 ms252152 KiB
#include "game.h" #include<iostream> #include<vector> using namespace std; #define pb push_back const int maxn = 3e5+10; int n, k, dir[maxn][30]; vector<int> g[maxn], gt[maxn]; int ans = 0; /* 0 -> fora desse nível 1 -> chega em mid 2 -> mid chega em */ void call(int a); void att(int l, int r, int a, int b, int lv); void call(int a) { for(auto b : g[a]) { att(0,k-1,a,b,0); } for(auto b : gt[a]) { att(0,k-1,b,a,0); } } void att(int l, int r, int a, int b, int lv) { if(l > r) return; int mid = (l+r)/2; if(a == mid) { if(dir[b][lv] == 0) { dir[b][lv] = 2; //mid chega no b call(b); //b muda } else if(dir[b][lv] == 1) { ans = 1; // b chega em mid e mid chega em b } return; } if(b == mid) { if(dir[a][lv] == 0) { dir[a][lv] = 1; //a chega em mid call(a); //a muda } else if(dir[a][lv] == 2) { ans = 1; // mid chega em a e a chega em mid } return; } if(dir[a][lv] == 0 && dir[b][lv] == 1) { //b chega em mid, a chega em b -> a chega em mid dir[a][lv] = 1; call(a); //a mudou att(l,mid-1,a,b,lv+1); //os dois tão no L return; } if(dir[a][lv] == 2 && dir[b][lv] == 0) { //mid chega em a, a chega em b -> mid chega em b dir[b][lv] = 2; call(b); //b mudou att(mid+1,r,a,b,lv+1); //os dois tão no R return; } if(dir[a][lv] == 2 && dir[b][lv] == 1) { //mid chega em a, a chega em b, b chega em mid -> mid chega em mid ans = 1; return; } if(dir[a][lv] == 1 && dir[b][lv] == 1) { att(l,mid-1,a,b,lv+1); //os dois tão no L | BRUTE ASSIM FICA LOG² return; } if(dir[a][lv] == 2 && dir[b][lv] == 2) { att(mid+1,r,a,b,lv+1); return; } } void build(int l, int r, int lv) { if(l > r) return; int mid = (l+r)/2; for(int i = l; i < mid; i++) { dir[i][lv] = 1; } for(int i = mid+1; i <= r; i++) { dir[i][lv] = 2; } build(l,mid-1,lv+1); build(mid+1,r,lv+1); } void init(int N, int K) { n = N; k = K; build(0,k-1,0); } int add_teleporter(int u, int v) { g[u].pb(v); gt[v].pb(u); if(u == v && u < k) return 1; att(0,k-1,u,v,0); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...