Submission #1286494

#TimeUsernameProblemLanguageResultExecution timeMemory
1286494StefanSebezXylophone (JOI18_xylophone)C++20
100 / 100
19 ms452 KiB
#include "xylophone.h" #include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") const int N=5050,inf=1e9; int a[N]; void solve(int n){ int l=1,r=n,idx=0; while(l<=r){ int mid=l+r>>1; if(query(mid,n)==n-1){l=mid+1;idx=mid;} else r=mid-1; } bool was[n+10]={false}; a[idx]=1;was[1]=true; int d[n+10]; for(int i=1;i<n;i++) d[i]=query(i,i+1); if(idx+1<=n) a[idx+1]=1+d[idx],was[a[idx+1]]=true; if(idx-1>=1) a[idx-1]=a[idx]+d[idx-1],was[a[idx-1]]=true; for(int i=idx+2;i<=n;i++){ if(!(1<=a[i-1]+d[i-1]&&a[i-1]+d[i-1]<=n)||was[a[i-1]+d[i-1]]) a[i]=a[i-1]-d[i-1]; else if(!(1<=a[i-1]-d[i-1]&&a[i-1]-d[i-1]<=n)||was[a[i-1]-d[i-1]]) a[i]=a[i-1]+d[i-1]; else{ int x=query(i-2,i); if(x==d[i-1]||x==d[i-2]){ if(a[i-2]>a[i-1]) a[i]=a[i-1]+d[i-1]; else a[i]=a[i-1]-d[i-1]; } else{ if(a[i-2]<a[i-1]) a[i]=a[i-1]+d[i-1]; else a[i]=a[i-1]-d[i-1]; } } was[a[i]]=true; } for(int i=idx-2;i>=1;i--){ if(!(1<=a[i+1]+d[i]&&a[i+1]+d[i]<=n)||was[a[i+1]+d[i]]) a[i]=a[i+1]-d[i]; else if(!(1<=a[i+1]-d[i]&&a[i+1]-d[i]<=n)||was[a[i+1]-d[i]]) a[i]=a[i+1]+d[i]; else{ int x=query(i,i+2); if(x==d[i+1]||x==d[i]){ if(a[i+2]>a[i+1]) a[i]=a[i+1]+d[i]; else a[i]=a[i+1]-d[i]; } else{ if(a[i+2]<a[i+1]) a[i]=a[i+1]+d[i]; else a[i]=a[i+1]-d[i]; } } was[a[i]]=true; } for(int 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...