Submission #1331907

#TimeUsernameProblemLanguageResultExecution timeMemory
1331907boclobanchatThe Big Prize (IOI17_prize)C++20
90 / 100
30 ms6636 KiB
#include"prize.h"
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
const int N=2e5;
const int K=500;
int fen[MAXN];
vector<int> w[MAXN],curr;
vector<int> askk(int pos)
{
	if(w[pos].empty()) return w[pos]=ask(pos);
	return w[pos];
}
void dnc(vector<int> vi,int val,vector<int> prel,vector<int> prer)
{
	vector<int> vv;
	int l=0,r=vi.size()-1;
	for(int i=0;i<vi.size();i++) if(i%2==0) vv.push_back(vi[l++]);
	else vv.push_back(vi[r--]);
	while(!vv.empty())
	{
		int pos=vv.back();
		vv.pop_back();
		vector<int> res=askk(pos-1);
		if(res[0]+res[1]==val)
		{
			vector<int> vl,vr;
			for(int i=0;i<vv.size();i++) if(i%2==0) vl.push_back(vv[i]);
			else vr.push_back(vv[i]);
			reverse(vr.begin(),vr.end());
			if(!vl.empty()&&res!=prel) dnc(vl,val,prel,res);
			if(!vr.empty()&&res!=prer) dnc(vr,val,res,prer);
			break;
		}
		else curr.push_back(pos);
	}
}
vector<int> update(vector<int> idx)
{
	int n=idx.size(),mx=0;
	for(int i=0;(i<31||(i-31)*(i-31)<=n)&&i<n;i++)
	{
		vector<int> res=askk(idx[i]-1);
		mx=max(mx,res[0]+res[1]);
	}
	vector<int> res,pre;
	for(int i=0;i<n;i++)
	{
		if(res.size()<K) res.push_back(idx[i]);
		if(res.size()==K)
		{
			vector<int> nex=askk(res.back()-1);
			if(nex[0]+nex[1]!=mx) curr.push_back(res.back()),res.pop_back();
			else
			{
			  if(nex!=pre) dnc(res,mx,pre,nex);
			  res.clear();
			}
		}
	}
	if(!res.empty()) dnc(res,mx,pre,askk(res.back()-1));
//	dnc(idx,mx,{0,mx},{mx,0});
	return curr;
}
int find_best(int n)
{
	vector<int> vi;
	for(int i=1;i<=n;i++) vi.push_back(i);
	vi=update(vi);
	for(auto v:vi) if(askk(v-1)==(vector<int>){0,0}) return v-1;
}

Compilation message (stderr)

prize.cpp: In function 'int find_best(int)':
prize.cpp:71:1: warning: control reaches end of non-void function [-Wreturn-type]
   71 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...