Submission #522906

#TimeUsernameProblemLanguageResultExecution timeMemory
522906CPSCXylophone (JOI18_xylophone)C++14
100 / 100
78 ms576 KiB
#include "xylophone.h"
# include <bits/stdc++.h>
#define f first
#define s second
#define pb push_back
using namespace std;
const int NN = 5005;
int le,ri,mid,ans,a[NN],val[NN],vl1,n,fix[NN];
int check(int val) {
	if (val <= 0 || val > n) return 0; else {
	   if (fix[val]) return 0;
 	   else
		  return 1;
	}
}
void solve(int N) {
	n = N;
    le = 2;
    ri = n;
    while (le <= ri) {
        mid = (le + ri) / 2;
        if (query(1,mid) == n - 1) {
            ri = mid - 1;
            ans = mid;
        } else le = mid + 1;
    }
    a[ans] = n;
    for (int i = ans + 1; i <= n; i++) {
        if (i == ans + 1) {
            val[i - 1] = query(i-1,i);
            a[i] = a[ans] - val[i - 1];
            fix[a[i]] = 1;
            continue;
        }
        val[i - 1] = query(i - 1, i);
        if (!check(a[i - 1] + val[i - 1])) {
        	a[i] = a[i - 1] - val[i - 1];
        	fix[a[i]] = 1;
        	continue;
		}
		if (!check(a[i - 1] + val[i - 1])) {
			a[i] = a[i - 1] + val[i - 1];
			fix[a[i]] = 1;
			continue;
		}
        vl1 = query(i - 2, i);
        if (val[i - 2] + val[i - 1] == vl1) {
            a[i] = (a[i - 2] > a[i - 1] ? (a[i - 1] - val[i - 1]) : (a[i - 1] + val[i - 1]));
        } else 
        a[i] = (a[i - 2] > a[i - 1] ? (a[i - 1] + val[i - 1]) : (a[i - 1] - val[i - 1]));
        fix[a[i]] = 1;
    }
    for (int i = ans - 1; i >= 1; i--) {
        if (i == ans - 1) {
            val[i] = query(i, i + 1);
            a[i] = a[ans] - val[i];
            fix[a[i]] = 1;
            continue;
        }
        val[i] = query(i, i + 1);
        if (!check(a[i + 1] - val[i])) {
        	a[i] = a[i + 1] + val[i];
        	fix[a[i]] = 1;
        	continue;
		}
		if (!check(a[i + 1] + val[i])) {
			a[i] = a[i + 1] - val[i];
			fix[a[i]] = 1;
			continue;
		}
        vl1 = query(i, i + 2);
        if (vl1 == val[i] + val[i + 1]) {
            a[i] = (a[i + 2] > a[i + 1] ? (a[i + 1] - val[i]) : (a[i + 1] + val[i]));
        } else a[i] = (a[i + 2] > a[i + 1] ? (a[i + 1] + val[i]) : (a[i + 1] - val[i]));
        fix[a[i]] = 1;
    }
    for (int i = 1; i <= n; i++) {
        answer(i,a[i]);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...