Submission #623517

#TimeUsernameProblemLanguageResultExecution timeMemory
623517LoboGame (APIO22_game)C++17
100 / 100
2399 ms120900 KiB
#include "game.h" #include<iostream> #include<vector> using namespace std; #define pb push_back #define fr first #define sc second #define mp make_pair const int maxn = 3e5+10; const int maxm = 5e5+10; int n, k; char dir[maxn][20]; // vector<pair<int,int>> g[maxn], gt[maxn]; vector<int> g[maxn]; int ans = 0; char lvedg[maxm]; int ledg[maxm], redg[maxm], A[maxm], B[maxm]; int cntedg = 0; /* 0 -> fora desse nível 1 -> chega em mid 2 -> mid chega em */ void recall(int a); void att(int l, int r, int lv, int a, int b, int id); void recall(int a) { for(auto id : g[a]) { att(ledg[id],redg[id],lvedg[id],A[id],B[id],id); // att(0,k-1,0,a,b,id); } // for(auto B : gt[a]) { // int b = B.fr; // int id = B.sc; // att(ledg[id],redg[id],lvedg[id],b,a,id); // // att(0,k-1,0,b,a,id); // } } void att(int l, int r, int lv, int a, int b, int id) { lvedg[id] = lv; ledg[id] = l; redg[id] = r; 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 recall(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 recall(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; recall(a); //a mudou att(l,mid-1,lv+1,a,b,id); //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; recall(b); //b mudou att(mid+1,r,lv+1,a,b,id); //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,lv+1,a,b,id); //os dois tão no L | BRUTE ASSIM FICA LOG² return; } if(dir[a][lv] == 2 && dir[b][lv] == 2) { att(mid+1,r,lv+1,a,b,id); //os dois tão no R | BRUTE ASSIM FICA LOG² 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(cntedg); g[v].pb(cntedg); // gt[v].pb(cntedg); A[cntedg] = u; B[cntedg] = v; if(u == v && u < k) return 1; att(0,k-1,0,u,v,cntedg); cntedg++; 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...