Submission #1300455

#TimeUsernameProblemLanguageResultExecution timeMemory
1300455ghammazhassanXylophone (JOI18_xylophone)C++20
0 / 100
1 ms336 KiB
#include <iostream> #include <cmath> #include <algorithm> #include <map> #include <unordered_map> #include <vector> #include <iomanip> #include <string> #include <queue> #include <set> #include <deque> #include "xylophone.h" using namespace std; static const int N_MAX = 5000; static const int Q_MAX = 10000; static int N; static int A[N_MAX]; static bool used[N_MAX]; static int query_c; static int answer_c; void solve(int n){ int l=1; int h=n; int m=(l+h)/2; while (l<h){ int x=query(1,m); if (x==n-1){ h=m; } else{ l=m+1; } m=(l+h)/2; } int r=m; l=1; h=r; m=(l+h+1)/2; while (l<h){ int x=query(m,r); if (x==n-1){ l=m; } else{ h=m-1; } m=(l+h+1)/2; } answer(l,1); answer(r,n); vector<int>a(n+1); a[l]=1; a[r]=n; map<pair<int,int>,int>d; d[{l,l}]=0; vector<int>vi(n+1); vi[1]=1; vi[n]=1; for (int i=l-1;i>=1;i--){ int x=query(i,i+1); if (a[i+1]-x<1 or vi[a[i+1]-x]){ a[i]=a[i+1]+x; vi[a[i+1]+x]=1; answer(i,a[i+1]+x); continue; } if (a[i+1]+x>n or vi[a[i+1]+x]){ a[i]=a[i+1]-x; vi[a[i+1]-x]=1; answer(i,a[i+1]-x); continue; } int y=query(i,i+2); int z=abs(a[i+1]-a[i+2]); if (y>z){ if (a[i+1]>a[i+2]){ a[i]=a[i+1]+x; vi[a[i+1]+x]=1; answer(i,a[i+1]+x); } else{ a[i]=a[i+1]-x; vi[a[i+1]-x]=1; answer(i,a[i+1]-x); } } else{ if (a[i+1]>a[i+2]){ a[i]=a[i+1]-x; vi[a[i+1]-x]=1; answer(i,a[i+1]-x); } else{ a[i]=a[i+1]+x; vi[a[i+1]+x]=1; answer(i,a[i+1]+x); } } } for (int i=l+1;i<r;i++){ int x=query(i-1,i); if (a[i-1]-x<1 or vi[a[i-1]-x]){ a[i]=a[i-1]+x; vi[a[i-1]+x]=1; answer(i,a[i-1]+x); continue; } if (a[i-1]+x>n or vi[a[i-1]+x]){ a[i]=a[i-1]-x; vi[a[i-1]-x]=1; answer(i,a[i-1]-x); continue; } int y=query(i-2,i); int z=abs(a[i-1]-a[i-2]); if (y>z){ if (a[i-1]>a[i-2]){ a[i]=a[i-1]+x; vi[a[i-1]+x]=1; answer(i,a[i-1]+x); } else{ a[i]=a[i-1]-x; vi[a[i-1]-x]=1; answer(i,a[i-1]-x); } } else{ if (a[i-1]>a[i-2]){ a[i]=a[i-1]-x; vi[a[i-1]-x]=1; answer(i,a[i-1]-x); } else{ a[i]=a[i-1]+x; vi[a[i-1]+x]=1; answer(i,a[i-1]+x); } } } for (int i=r+1;i<=n;i++){ int x=query(i-1,i); if (a[i-1]-x<1 or vi[a[i-1]-x]){ a[i]=a[i-1]+x; vi[a[i-1]+x]=1; answer(i,a[i-1]+x); continue; } if (a[i-1]+x>n or vi[a[i-1]+x]){ a[i]=a[i-1]-x; vi[a[i-1]-x]=1; answer(i,a[i-1]-x); continue; } int y=query(i-2,i); int z=abs(a[i-1]-a[i-2]); if (y>z){ if (a[i-1]>a[i-2]){ a[i]=a[i-1]+x; vi[a[i-1]+x]=1; answer(i,a[i-1]+x); } else{ a[i]=a[i-1]-x; vi[a[i-1]-x]=1; answer(i,a[i-1]-x); } } else{ if (a[i-1]>a[i-2]){ a[i]=a[i-1]-x; vi[a[i-1]-x]=1; answer(i,a[i-1]-x); } else{ a[i]=a[i-1]+x; vi[a[i-1]+x]=1; answer(i,a[i-1]+x); } } } return; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...