제출 #160799

#제출 시각아이디문제언어결과실행 시간메모리
160799Leonardo_PaesXylophone (JOI18_xylophone)C++17
47 / 100
110 ms400 KiB
#include <bits/stdc++.h> #include "xylophone.h" using namespace std; const int maxn = 5e3+10; int n, res[maxn], pos[maxn]; inline void find_1(){ int ini=1, fim=n, meio, ans=-1; while(ini<=fim){ meio = (ini+fim) >> 1; if(query(meio, n)>=(n-1)){ ans = meio; ini = meio+1; } else{ fim = meio-1; } } pos[1] = ans; res[ans] = 1; } inline void find_n(){ int ini=pos[1]+1, fim=n, meio, ans=-1; while(ini<=fim){ meio = (ini+fim) >> 1; if(query(pos[1], meio)>=(n-1)){ ans = meio; fim = meio-1; } else{ ini = meio+1; } } pos[n] = ans; res[ans] = n; } inline void solve_left(int j, int k){ if(j<=1 or res[j-1]!=0) return; int i = j-1; int diff1 = query(i, j); /*if(pos[res[j] + diff1]!=0){ res[i] = res[j] - diff1; pos[res[i]] = i; } else if(pos[res[j] - diff1]!=0){ res[i] = res[j] + diff1; pos[res[i]] = i; } else{*/ int diff2 = query(i, k); if(diff1 + abs(res[j]-res[k]) == diff2){ if(res[k]<res[j]){ res[i] = res[j] + diff1; pos[res[i]] = i; } else{ res[i] = res[j] - diff1; pos[res[i]] = i; } } else{ if(res[k]<res[j]){ res[i] = res[j] - diff1; pos[res[i]] = i; } else{ res[i] = res[j] + diff1; pos[res[i]] = i; } } //} solve_left(i, j); } inline void solve_right(int j, int k){ if(k>=n or res[k+1]!=0) return; int l = k+1; int diff1 = query(k, l); /*if((res[k] + diff1) > n or pos[res[k] + diff1]!=0){ res[l] = res[k] - diff1; pos[res[l]] = l; } else if((res[k] - diff1) < 1 or pos[res[k] - diff1]!=0){ res[l] = res[k] + diff1; pos[res[l]] = l; } else{*/ int diff2 = query(j, l); if(diff1 + abs(res[j]-res[k]) == diff2){ if(res[k]>res[j]){ res[l] = res[k] + diff1; pos[res[l]] = l; } else{ res[l] = res[k] - diff1; pos[res[l]] = l; } } else{ if(res[k]>res[j]){ res[l] = res[k] - diff1; pos[res[l]] = l; } else{ res[l] = res[k] + diff1; pos[res[l]] = l; } } //} solve_right(k, l); } void solve(int N){ n = N; find_1(); find_n(); int diff; if(pos[1]+1 <= n and res[pos[1]+1] == 0){ diff = query(pos[1], pos[1]+1); res[pos[1]+1] = 1 + diff; pos[1+diff] = pos[1]+1; } if(pos[1]-1 >= 1 and res[pos[1]-1] == 0){ diff = query(pos[1]-1, pos[1]); res[pos[1]-1] = 1 + diff; pos[1+diff] = pos[1]-1; } if(pos[n]+1 <=n and res[pos[n]+1] == 0){ diff = query(pos[n], pos[n]+1); res[pos[n]+1] = n - diff; pos[n-diff] = pos[n]+1; } if(pos[n]-1 >= 1 and res[pos[n]-1] == 0){ diff = query(pos[n]-1, pos[n]); res[pos[n]-1] = n - diff; pos[n-diff] = pos[n] - 1; } solve_left(pos[1]-1, pos[1]); solve_left(pos[n]-1, pos[n]); solve_right(pos[n], pos[n]+1); for(int i=1; i<=n; i++){ answer(i, res[i]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...