Submission #1137001

#TimeUsernameProblemLanguageResultExecution timeMemory
1137001PlayVoltzXylophone (JOI18_xylophone)C++20
100 / 100
17 ms436 KiB
#include "xylophone.h" #include <bits/stdc++.h> using namespace std; static int A[5000]; void solve(int n){ vector<int> ans(n+1); vector<bool> got(n+1, 0); int low=0, high=n+1; while (low+1<high){ int mid=(low+high)/2; if (query(mid, n)==n-1)low=mid; else high=mid; } got[1]=1; ans[low]=1; if (low+1<=n)ans[low+1]=1+query(low, low+1), got[ans[low+1]]=1; for (int i=low+2; i<=n; ++i){ int d=query(i-1, i); if (ans[i-1]-d<=0||got[ans[i-1]-d])ans[i]=ans[i-1]+d; else if (ans[i-1]+d>n||got[ans[i-1]+d])ans[i]=ans[i-1]-d; else{ int temp=query(i-2, i); if (ans[i-2]>ans[i-1]){ if (temp==ans[i-2]-ans[i-1]+d)ans[i]=ans[i-1]-d; else ans[i]=ans[i-1]+d; } else{ if (temp==ans[i-1]-ans[i-2]+d)ans[i]=ans[i-1]+d; else ans[i]=ans[i-1]-d; } } got[ans[i]]=1; } if (low>1)ans[low-1]=1+query(low-1, low), got[ans[low-1]]=1; for (int i=low-2; i>=1; --i){ int d=query(i, i+1); if (ans[i+1]-d<=0||got[ans[i+1]-d])ans[i]=ans[i+1]+d; else if (ans[i+1]+d>n||got[ans[i+1]+d])ans[i]=ans[i+1]-d; else{ int temp=query(i, i+2); if (ans[i+2]>ans[i+1]){ if (temp==ans[i+2]-ans[i+1]+d)ans[i]=ans[i+1]-d; else ans[i]=ans[i+1]+d; } else{ if (temp==ans[i+1]-ans[i+2]+d)ans[i]=ans[i+1]+d; else ans[i]=ans[i+1]-d; } } got[ans[i]]=1; } for (int i=1; i<=n; ++i)answer(i, ans[i]); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...