제출 #285756

#제출 시각아이디문제언어결과실행 시간메모리
285756PyqeXylophone (JOI18_xylophone)C++14
100 / 100
75 ms632 KiB
#include "xylophone.h" #include <bits/stdc++.h> using namespace std; long long n,sq[5069]; bitset<5069> vtd; bool vld(long long x) { return x>0&&x<=n&&!vtd[x]; } void fl(long long lh,long long rh,long long u) { long long i,k,l; for(i=lh;i!=rh+u;i+=u) { k=query(min(i,i-u),max(i,i-u)); if(!vld(sq[i-u]-k)) { sq[i]=sq[i-u]+k; } else if(!vld(sq[i-u]+k)) { sq[i]=sq[i-u]-k; } else { l=query(min(i,i-u*2),max(i,i-u*2)); if(max(sq[i-u]+k,sq[i-u*2])-min(sq[i-u],sq[i-u*2])==l) { sq[i]=sq[i-u]+k; } else { sq[i]=sq[i-u]-k; } } vtd[sq[i]]=1; } } void solve(int on) { long long i,lh,rh,md,zz,st,fn; n=on; zz=1; for(lh=2,rh=n-1;lh<=rh;) { md=(lh+rh)/2; if(query(md,n)==n-1) { zz=md; lh=md+1; } else { rh=md-1; } } st=zz; sq[st]=1; vtd[1]=1; zz=n; for(lh=st+1,rh=n-1;lh<=rh;) { md=(lh+rh)/2; if(query(1,md)==n-1) { zz=md; rh=md-1; } else { lh=md+1; } } fn=zz; sq[fn]=n; vtd[n]=1; fl(st-1,1,-1); fl(st+1,fn-1,1); fl(fn+1,n,1); for(i=1;i<=n;i++) { answer(i,sq[i]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...