제출 #972773

#제출 시각아이디문제언어결과실행 시간메모리
972773sleepntsheep밀림 점프 (APIO21_jumps)C++17
60 / 100
1211 ms16828 KiB
#include "jumps.h" #include <vector> #include <algorithm> int subtask = -1; #define MAX_N 200000 #define MAX_M (2*MAX_N) int N, head[MAX_N], nxt[MAX_M], vv[MAX_M], timer, ng[MAX_N], pg[MAX_N], HI[MAX_N], H[MAX_N], high[MAX_N], low[MAX_N]; int dd[MAX_N], pp[MAX_N], jj[MAX_N], dd_[MAX_N], pp_[MAX_N], jj_[MAX_N]; void link(int u, int v) { static int i = 1; nxt[i] = head[u]; vv[i] = v; head[u] = i++; } void init(int N, std::vector<int> H) { ::N = N; if (N <= 200) subtask = 2; else if (N <= 2000) subtask = 3; int flag = 1; for (int i = 1; i < N; ++i) if (H[i] != H[i-1] + 1) flag = 0; if(flag) subtask = 1; static int stk[MAX_N], so; so = 0; for (int i = 0; i < N; stk[so++] = i++) while (so && H[stk[so-1]] < H[i]) ng[stk[so-1]]=i, link(stk[--so], i); while(so)ng[stk[--so]]=-1; for (int i = N - 1; i >= 0; stk[so++] = i--) while (so && H[stk[so-1]] < H[i]) pg[stk[so-1]]=i, link(stk[--so], i); while(so)pg[stk[--so]]=-1; for (int i = 0; i < N; ++i) HI[::H[i]=H[i]-1] = i; for (int j = N; j--;) { int i = HI[j]; int high = (pg[i] == -1) ? ng[i] : (ng[i] == -1 ? pg[i] : (H[ng[i]] > H[pg[i]] ? ng[i] : pg[i])); if (high != -1) { dd[i] = dd[high] + 1; pp[i] = high; jj[i] = dd[high] - dd[jj[high]] == dd[jj[high]] - dd[jj[jj[high]]] ? jj[jj[high]] : high; } else pp[i] = jj[i] = i; ::high[i] = high; ::low[i] = pg[i] + ng[i] - ::high[i]; int low = ::low[i]; if (low != -1) { dd_[i] = dd_[low] + 1; pp_[i] = low; jj_[i] = dd_[low] - dd_[jj_[low]] == dd_[jj_[low]] - dd_[jj_[jj_[low]]] ? jj_[jj_[low]] : low; } else pp_[i] = jj_[i] = i; } if (subtask == -1) subtask = 4; } int Q_COUNTER = 0; int minimum_jumps(int A, int B, int C, int D) { ++Q_COUNTER; if (subtask == 1) return (A>D)?-1:(B>=C?0:C-B); if (subtask == 4 && Q_COUNTER > 5) subtask = 5; if(subtask <= 4) { int dd[MAX_N], qu[MAX_N], qh=0, qt=0,z=1e9; for(int j=0;j<N;++j)dd[j]=1e9; for (int i = A; i <= B; ++i) dd[qu[qh++]=i]=0; while(qh-qt) for(int u=qu[qt++],j=head[u];j;j=nxt[j]) if(dd[vv[j]]>dd[u]+1)dd[vv[j]]=dd[u]+1,qu[qh++]=vv[j]; for (int j = C; j <= D; ++j)if(dd[j]!=1e9&&dd[j]<z)z=dd[j]; return(z<1e9?z:-1); } if (subtask == 5 && A != B) subtask = 6; if (subtask == 6 && C != D) subtask = 7; if (subtask == 5) { int u = A, u1; for(;pp[u]!=u;) { if (H[jj[u]]<=H[C])u=jj[u]; else if(H[pp[u]]<=H[C])u=pp[u]; else break; } u1=u; for(;pp_[u]!=u;) { if(H[jj_[u]]<=H[C])u=jj_[u]; else if(H[pp_[u]]<=H[C])u=pp_[u]; else break; } if(u!=C)return -1; return dd_[u1]-dd_[u]+dd[A]-dd[u1]; } if (subtask == 6) { } return -1; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...