Submission #85120

#TimeUsernameProblemLanguageResultExecution timeMemory
85120nikolapesic2802popa (BOI18_popa)C++14
61 / 100
129 ms644 KiB
#include <bits/stdc++.h> #include "popa.h" using namespace std; #define ll long long #define pb push_back /*bool query(int a,int b,int c,int d) { printf("%i-%i %i-%i?\n",a,b,c,d); int res; scanf("%i",&res); return res; }*/ bool levo(int poz) { return query(poz,poz,poz-1,poz); } bool desno(int poz) { return query(poz,poz,poz,poz+1); } int solve(int _N,int* Left,int* Right) { int n=_N; for(int i=0;i<n;i++) { Left[i]=-1; Right[i]=-1; } vector<int> parent(n); fill(parent.begin(),parent.end(),-1); for(int i=0;i<n;i++) { if(i>0&&parent[i]==-1) { /*if(levo(i)) {*/ vector<int> mog; int tr=i-1; mog.pb(tr); while(parent[tr]!=-1){ tr=parent[tr]; mog.pb(tr); } reverse(mog.begin(),mog.end()); int l=0,r=mog.size()-1; while(l<r) { int m=(l+r)>>1; if(query(i,i,mog[m],i)) { r=m; } else { l=m+1; } } l=mog[l]; //printf("Postavljam %i izmedju %i i %i\n",i,l,parent[l]); parent[i]=parent[l]; if(parent[i]!=-1) Right[parent[i]]=i; Left[i]=l; parent[l]=i; /*} else { assert(0); }*/ } if(i<n-1) { if(desno(i)) { assert(parent[i+1]==-1); parent[i+1]=i; Right[i]=i+1; } } } int cnt=0,poz; for(int i=0;i<n;i++) { if(parent[i]==-1){ poz=i; cnt++; } } assert(cnt==1); /*queue<int> q; q.push(poz); vector<int> visited(n); while(!q.empty()) { int tr=q.front(); q.pop(); if(tr==-1) continue; visited[tr]=1; q.push(Left[tr]); q.push(Right[tr]); } for(int i=0;i<n;i++) assert(visited[i]);*/ return poz; //assert(0); /*printf("Left:\n"); for(int i=0;i<n;i++) { printf("%i ",Left[i]); } printf("\nRight:\n"); for(int i=0;i<n;i++) { printf("%i ",Right[i]); }*/ }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...