Submission #1336390

#TimeUsernameProblemLanguageResultExecution timeMemory
1336390aaaaaaaaXylophone (JOI18_xylophone)C++20
100 / 100
20 ms580 KiB
#include <bits/stdc++.h>
#include "xylophone.h"

using namespace std;

void solve(int N) {

    vector<int> ans(N + 1, 0);

	int res = query(1, N), pos = -1, st = 1, en = N;

	while(st <= en){
        int mid = st + (en - st) / 2;
        if(query(mid, N) == res){
            pos = mid;
            st = mid + 1;
        }else{
            en = mid - 1;
        }
	}

	ans[pos] = 1;

	set<int> seen;

	if(pos - 1 >= 1){
        ans[pos - 1] = query(pos - 1, pos) + 1;
        seen.insert(ans[pos - 1]);
	}

	if(pos + 1 <= N){
        ans[pos + 1] = query(pos, pos + 1) + 1;
        seen.insert(ans[pos + 1]);
	}

	for(int i = pos + 2; i <= N; ++i){
        int X = query(i - 1, i);

        if(seen.find(ans[i - 1] + X) != seen.end() || (ans[i - 1] + X) > N){
            ans[i] = ans[i - 1] - X;
            seen.insert(ans[i]);
            continue;
        }

        if(seen.find(ans[i - 1] - X) != seen.end() || (ans[i - 1] - X) <= 0){
            ans[i] = ans[i - 1] + X;
            seen.insert(ans[i]);
            continue;
        }

        int a = ans[i - 2], b = ans[i - 1];
        int z = min(ans[i - 1] - X, a);
        int a2 = query(i - 2, i);
        if(ans[i - 2] < ans[i - 1]){
            if(a2 == ans[i - 1] - z){
                ans[i] = ans[i - 1] - X;
            }else{
                ans[i] = ans[i - 1] + X;
            }
        }else{
            if(ans[i - 2] - (ans[i - 1] - X) == a2){
                ans[i] = ans[i - 1] - X;
            }else{
                ans[i] = ans[i - 1] + X;
            }
        }

        seen.insert(ans[i]);
	}

	for(int i = pos - 2; i >= 1; --i){
        int X = query(i, i + 1);

        if(seen.find(ans[i + 1] + X) != seen.end() || (ans[i + 1] + X) > N){
            ans[i] = ans[i + 1] - X;
            seen.insert(ans[i]);
            continue;
        }

        if(seen.find(ans[i + 1] - X) != seen.end() || (ans[i + 1] - X) <= 0){
            ans[i] = ans[i + 1] + X;
            seen.insert(ans[i]);
            continue;
        }

        int a = ans[i + 2], b = ans[i + 1];
        int z = min(ans[i + 1] - X, a);
        int a2 = query(i, i + 2);
        if(ans[i + 2] < ans[i + 1]){
            if(a2 == ans[i + 1] - z){
                ans[i] = ans[i + 1] - X;
            }else{
                ans[i] = ans[i + 1] + X;
            }
        }else{
            if(ans[i + 2] - (ans[i + 1] - X) == a2){
                ans[i] = ans[i + 1] - X;
            }else{
                ans[i] = ans[i + 1] + X;
            }
        }

        seen.insert(ans[i]);
	}



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