제출 #160781

#제출 시각아이디문제언어결과실행 시간메모리
160781Leonardo_PaesXylophone (JOI18_xylophone)C++17
0 / 100
3 ms396 KiB
#include <bits/stdc++.h> #include "xylophone.h" using namespace std; const int maxn = 5e3+10; int n, res[maxn], pos[maxn]; /*int query(int l, int r){ int mx=0, mn=n+1; for(int i=l; i<=r; i++) mx = max(mx, vet[i]); for(int i=l; i<=r; i++) mn = min(mn, vet[i]); return mx-mn; }*/ 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; } 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; } 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); } 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(pos[res[k] + diff1]!=0){ res[l] = res[k] - diff1; pos[res[l]] = l; } else if(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[j] + diff1; pos[res[l]] = l; } else{ res[l] = res[j] - diff1; pos[res[l]] = l; } } else{ if(res[k]>res[j]){ res[l] = res[j] - diff1; pos[res[l]] = l; } else{ res[l] = res[j] + 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...