Submission #1348940

#TimeUsernameProblemLanguageResultExecution timeMemory
1348940jumpXylophone (JOI18_xylophone)C++20
0 / 100
0 ms344 KiB
#include "xylophone.h"
#include <bits/stdc++.h>
std::map<int,int> cache;
int twc(int a1,int a2,int a3){
	return std::max(std::max(std::abs(a1-a2),std::abs(a2-a3)),std::abs(a1-a3));
}
void doAnswer(int i,int a){
	std::cout << i << ' ' << a << '\n';
	answer(i,a);
}
void solve(int N) {
	int l=2,r=N;
	int range=query(1,N);//i suppose this is always N-1
	//find highest
	while(l<r){
		int mid=(l+r)/2;
		if(query(1,mid)==range){
			r=mid;
		}
		else{
			l=mid+1;
		}
	}
	int high=r;
	doAnswer(high,N);
	cache[N]=high;
	if(high!=N){
		int plast = N;
		int last = N-query(high,high+1);
		doAnswer(high+1,last);
		for(int i=high+2;i<=N;i++){
			int diff = query(i-1,i);
			int n1 = last+diff,n2 = last-diff;
			if(cache.find(n1)!=cache.end()||n1>N){
				plast=last;
				last=n2;
				cache[n2]=i;
				doAnswer(i,n2);
			}
			else if(cache.find(n2)!=cache.end()||n2<1){
				plast=last;
				last=n1;
				cache[n1]=i;
				doAnswer(i,n1);
			}
			else{
				int value = query(i-2,i);
				if(twc(plast,last,n1)==value){
					plast=last;
					last=n1;
					cache[n1]=i;
					doAnswer(i,n1);
				}
				else if(twc(plast,last,n2)==value){
					plast=last;
					last=n2;
					cache[n2]=i;
					doAnswer(i,n2);
				}
				else std::cout << "R";
			}
		}
	}
	if(high!=1){
		//std::cout << "SMTH";
		int plast = N;
		int last = N-query(high-1,high);
		doAnswer(high-1,last);
		for(int i=high-2;i>=1;i--){
			int diff = query(i,i+1);
			int n1 = last+diff,n2 = last-diff;
			if(cache.find(n1)!=cache.end()||n1>N){
				plast=last;
				last=n2;
				cache[n2]=i;
				doAnswer(i,n2);
			}
			else if(cache.find(n2)!=cache.end()||n2<1){
				plast=last;
				last=n1;
				cache[n1]=i;
				doAnswer(i,n1);
			}
			else{
				int value = query(i,i+2);
				if(twc(plast,last,n1)==value){
					plast=last;
					last=n1;
					cache[n1]=i;
					doAnswer(i,n1);
				}
				else if(twc(plast,last,n2)==value){
					plast=last;
					last=n2;
					cache[n2]=i;
					doAnswer(i,n2);
				}
				else std::cout << "L";
			}
		}
	}
}
//5 3 2 1 5 4
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...