제출 #239593

#제출 시각아이디문제언어결과실행 시간메모리
239593cfalasXylophone (JOI18_xylophone)C++14
47 / 100
77 ms500 KiB
#include<bits/stdc++.h> using namespace std; #include "xylophone.h" int ans[100001] = {}; int used[100001] = {}; void solve(int N) { // Find 1 int pos=0; int value=N-1; while(N-1==value){ pos++; value = query(pos, N); //cout<<pos<<" "<<value<<endl; } pos--; ans[pos] = 1; ans[pos+1] = 1+query(pos, pos+1); if(pos>=2) ans[pos-1] = 1+query(pos-1, pos); bool inc=false; for(int i=pos+2;i<=N;i++){ int p=query(i-1, i); if(ans[i-1]+p>N){ ans[i] = ans[i-1]-p; inc = ans[i]<ans[i-1]; continue; } else if(ans[i-1]-p<=0){ ans[i] = ans[i-1]+p; inc = ans[i]<ans[i-1]; continue; } int pp = query(i-2, i); if(inc){ if(p>=pp || pp==abs(ans[i-1]-ans[i-2])) ans[i] = ans[i-1] + p; else ans[i] = ans[i-1]-p; } else{ if(p>=pp || pp==abs(ans[i-1]-ans[i-2])) ans[i] = ans[i-1] - p; else ans[i] = ans[i-1]+p; } inc = ans[i]<ans[i-1]; //cout<<i<<" "<<ans[i]<<endl; } inc = false; for(int i=pos-2;i>0;i--){ int p=query(i, i+1); if(ans[i+1]+p>N && !used[ans[i+1]+p]){ ans[i] = ans[i+1]-p; inc = ans[i]<ans[i+1]; used[ans[i]] = true; continue; } else if(ans[i+1]-p<=0 && !used[ans[i+1]-p]){ ans[i] = ans[i+1]+p; inc = ans[i]<ans[i+1]; used[ans[i]] = true; continue; } int pp = query(i, i+2); if(inc){ if(p>=pp || pp==abs(ans[i+2]-ans[i+1])) ans[i] = ans[i+1] + p; else ans[i] = ans[i+1]-p; } else{ if(p>=pp || pp==abs(ans[i+2]-ans[i+1])) ans[i] = ans[i+1] - p; else ans[i] = ans[i+1]+p; } used[ans[i]] = true; inc = ans[i]<ans[i+1]; //cout<<i<<" "<<ans[i]<<endl; } //cout<<endl; for(int i = 1; i <= N; i++) { //cout<<i<<" "<<ans[i]<<endl; answer(i, ans[i]); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...