Submission #1300330

#TimeUsernameProblemLanguageResultExecution timeMemory
1300330ghammazhassanXylophone (JOI18_xylophone)C++20
0 / 100
1 ms332 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,l);
		if (!d[{i+1,l}]){
			d[{i+1,l}]=query(i+1,l);
		}
		int z=d[{i+1,l}];
		if (z>y){
			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(l,i);
		if (!d[{i-1,l}]){
			d[{i-1,l}]=query(l,i-1);
		}
		int z=d[{i-1,l}];
		if (z>y){
			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(r,i);
		if (!d[{i-1,l}]){
			d[{i-1,l}]=query(r,i-1);
		}
		int z=d[{i-1,l}];
		if (z>y){
			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...