Submission #152732

#TimeUsernameProblemLanguageResultExecution timeMemory
152732junodeveloperXylophone (JOI18_xylophone)C++14
100 / 100
97 ms512 KiB
#include "xylophone.h" static int A[5010]; static bool used[5010]={0}; int n; inline void Set(int i, int x) { A[i]=x; used[x]=1; } inline bool Poss(int x) { return 1<=x&&x<=n&&!used[x]; } void solve(int N) { n=N; int lo=1, hi=N, x, y; while(lo<hi) { int mid=(lo+hi+1)/2; x=query(mid,N); if(x==N-1) lo=mid; else hi=mid-1; } Set(lo,1); int i; if(lo+1<=N) { x=query(lo,lo+1); Set(lo+1,x+1); } if(lo-1>=1) { x=query(lo-1,lo); Set(lo-1,x+1); } for(i=lo+2;i<=N;i++) { x=query(i-1,i); if(!Poss(A[i-1]+x)) { Set(i,A[i-1]-x); } else if(!Poss(A[i-1]-x)) { Set(i,A[i-1]+x); } else { if(A[i-2]>A[i-1]) { y=query(i-2,i); if(y==A[i-2]-A[i-1]+x) { Set(i,A[i-1]-x); } else { Set(i,A[i-1]+x); } } else { y=query(i-2,i); if(y==A[i-1]-A[i-2]+x) { Set(i,A[i-1]+x); } else { Set(i,A[i-1]-x); } } } } for(i=lo-2;i>=1;i--) { x=query(i,i+1); if(!Poss(A[i+1]+x)) { Set(i,A[i+1]-x); } else if(!Poss(A[i+1]-x)) { Set(i,A[i+1]+x); } else { if(A[i+2]>A[i+1]) { y=query(i,i+2); if(y==A[i+2]-A[i+1]+x) { Set(i,A[i+1]-x); } else { Set(i,A[i+1]+x); } } else { y=query(i,i+2); if(y==A[i+1]-A[i+2]+x) { Set(i,A[i+1]+x); } else { Set(i,A[i+1]-x); } } } } for(i=1;i<=N;i++) answer(i,A[i]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...