Submission #1272836

#TimeUsernameProblemLanguageResultExecution timeMemory
1272836choedXylophone (JOI18_xylophone)C++20
0 / 100
1 ms332 KiB
#include "xylophone.h"
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pll pair<ll, ll>
#define plll pair<ll,pll>

static int A[5000];

void solve(int N) {

	// int value = query(1, N);
	
	ll diff[N];
	for(int i=1; i<N; i++)
		diff[i]=query(i,i+1);

	if(N==2){
		answer(1, 1);
		answer(2, 2);
		return;
	}
	
	ll konfig[N][2]; // 0 itu awalnya +, 1 awalnya -
	memset(konfig,0,sizeof(konfig));
	ll val = query(1, 3);
	if(val = diff[1] + diff[2]){
		konfig[1][0] = diff[1];
		konfig[2][0] = diff[2];
		konfig[1][1] = -diff[1];
		konfig[2][1] = -diff[2];
	}else{
		konfig[1][0] = diff[1];
		konfig[2][0] = -diff[2];
		konfig[1][1] = -diff[1];
		konfig[2][1] = diff[2];
	}

	// cari konfig yang mungkin
	for(int i=3; i<N; i++){
		val=query(i-1, i+1);
		if(val==diff[i-1]+diff[i]){
			if(konfig[i-1][0]>0){
				konfig[i][0]=diff[i];
				konfig[i][1]=-diff[i];
			}else{
				konfig[i][0]=-diff[i];
				konfig[i][1]=diff[i];
			}
		}else{
			if(konfig[i-1][0]>0){
				konfig[i][0]=-diff[i];
				konfig[i][1]=diff[i];
			}else{
				konfig[i][0]=diff[i];
				konfig[i][1]=-diff[i];
			}
		}
	}
	
	ll sum=0;
	ll mn=0, mnidx=0;
	ll mx=0, mxidx=0;
	ll ans[N+1];

	// cek kevalid-an konfig pertama dulu ---------------------------------
	for(int i=1; i<N; i++){
		sum+=konfig[i][0];
		if(sum<mn){
			mn=sum;
			mnidx=i;
		}
		if(sum>mx){
			mx=sum;
			mxidx=i;
		}
	}

	if(mnidx<mxidx){
		sum=1;
		ans[mnidx+1]=1;
		for(int i=mnidx-1; i>=0; i--){
			sum += -konfig[i][0];
			ans[i+1] =  sum;
		}

		sum=1;
		for(int i=mnidx+1; i<N; i++){
			sum += konfig[i][0];
			ans[i+1] = sum;
		}

		goto done;
	}

	// cek konfig kedua -------------------------------------------------
	sum=0;
	mn=mnidx=0;
	mx=mxidx=0;
	for(int i=1; i<N; i++){
		sum+=konfig[i][1];
		if(sum<mn){
			mn=sum;
			mnidx=i;
		}
		if(sum>mx){
			mx=sum;
			mxidx=i;
		}
	}

	if(mnidx<mxidx){
		sum=1;
		ans[mnidx+1]=1;
		for(int i=mnidx-1; i>=0; i--){
			sum += -konfig[i][1];
			ans[i+1] =  sum;
		}

		sum=1;
		for(int i=mnidx+1; i<N; i++){
			sum += konfig[i][1];
			ans[i+1] = sum;
		}
	}

	// -----------------------------------------------------------------

	done:
	for(int i = 1; i <= N; i++) {
		answer(i, ans[i]);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...