This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
int m,ball=0,a[200005][2],ans=-1;
int find(int x)
{
if(a[x][0]==-1)
{
std::vector<int> res = ask(x);
a[x][0]=res[0];
a[x][1]=res[1];
}
return 0;
}
int solve(int s,int e,int num){
//cout<<s<<" "<<e<<endl;
if(s>=e-1)return 0;
if(ans!=-1)return 0;
int ne,ns;
ne=(s+e)/2,ns=(s+e)/2;
while(ns<e)
{
find(ns);
if(a[ns][0]+a[ns][1]==0)
{
ans=ns;
return 0;
}
if(a[ns][0]+a[ns][1]!=ball)ns++;
else break;
}
while(s<ne)
{
find(ne);
if(a[ne][0]+a[ne][1]==0)
{
ans=ne;
break;
}
if(a[ne][0]+a[ne][1]!=ball)ne--;
else break;
}
//cout<<ne<<" "<<ns<<endl;
int tmp=rand()%2;
if(tmp==1)
{
if(a[ns][1]!=a[e][1])solve(ns,e,a[ns][1]-a[e][1]);
if(a[s][0]!=a[ne][0])solve(s,ne,a[ne][0]-a[s][0]);
}
else
{
if(a[s][0]!=a[ne][0])solve(s,ne,a[ne][0]-a[s][0]);
if(a[ns][1]!=a[e][1])solve(ns,e,a[ns][1]-a[e][1]);
}
}
int find_best(int n) {
for(int i=0;i<n;i++)
{
a[i][0]=-1;
a[i][1]=-1;
}
for(int t = 0; t < 450; t++) {
long long int i=rand();
i%=n;
find(i);
//cout<<a[i][0]<<" "<<a[i][1]<<endl;
if(a[i][0]+a[i][1]==0)
{
ans=i;
break;
}
if(a[i][0] + a[i][1] > ball)
{
m=i;
ball=a[i][0]+a[i][1];
}
}
if(ans!=-1)return ans;
// cout<<m<<endl;
int start=0,end=n-1;
while(true)
{
find(start);
if(a[start][0]+a[start][1]==0)ans=start;
if(a[start][0]+a[start][1]!=ball)start++;
else break;
}
while(true)
{
find(end);
if(a[end][0]+a[end][1]==0)ans=end;
if(a[end][0]+a[end][1]!=ball)end--;
else break;
}
if(ans!=-1)return ans;
//cout<<start<<" "<<end<<endl;
solve(start,end,a[end][0]-a[start][0]);
return ans;
}
Compilation message (stderr)
prize.cpp: In function 'int solve(int, int, int)':
prize.cpp:55:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |