제출 #321113

#제출 시각아이디문제언어결과실행 시간메모리
321113seedkin로카히아 유적 (FXCUP4_lokahia)C++17
0 / 100
3 ms1004 KiB
#include "lokahia.h" #include <stdio.h> int root[205]; // who is root? int select[205]; // able to get mana? int findRoot(int r, int leaf) { if(r == leaf) return select[r]; int temp = root[leaf]; select[r] += select[leaf]; root[leaf] = r; select[leaf] = 0; return temp == -1 ? select[r]: findRoot(r, temp); } int getRoot(int n) { int r = root[n]; if(r == -1) return n; findRoot(r, n); root[n] = getRoot(r); return root[n]; } int FindBase(int N){ if(N==1) return 0; int target = N / 2; int boss[205]; int bossNum = 0; for(int i =0; i < N; i++) { root[i] = -1; select[i] = 1; boss[i] = 0; } for(int i =0; i< N;) { int s = 1; boss[bossNum++] = i; for(int j =i+1; j < N; j++) { if(getRoot(i) == getRoot(j)) { s++; continue; } int r = CollectRelics(getRoot(i), getRoot(j)); if( r == -1) { s--; if(s == 0) { i = j+1; if(i == N) return -1; break; } continue; } int num = findRoot(getRoot(r), getRoot(i)); num = findRoot(getRoot(r),getRoot(j)); if(num > target) return getRoot(r); s++; } } int c = boss[bossNum-1]; for(int i =0; i < bossNum-1; i++) { int a = boss[i]; if(getRoot(c) == getRoot(a)) continue; int r = CollectRelics(getRoot(c), getRoot(a)); if(r == -1) { int b = boss[i+1]; for(int j = a+1; j < b; j++) { if(getRoot(c) == getRoot(j)) continue; if(getRoot(j) != j) continue; r = CollectRelics(getRoot(c), getRoot(j)); if(r == -1) continue; int num = findRoot(getRoot(r), getRoot(c)); num = findRoot(getRoot(r), getRoot(j)); if(num > target) return getRoot(r); } continue; } int num = findRoot(getRoot(r), getRoot(c)); num = findRoot(getRoot(r), getRoot(a)); if(num > target) return getRoot(r); } if(select[getRoot(c)] > target ) return getRoot(c); return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...