제출 #781121

#제출 시각아이디문제언어결과실행 시간메모리
781121JoenPoenManXylophone (JOI18_xylophone)C++17
100 / 100
93 ms724 KiB

#include "xylophone.h"
#include <bits/stdc++.h>

using namespace std;
typedef pair<int, int> ii;

#define ALL(arr) begin(arr), end(arr)
#define CONTAINS(arr, val) (find(begin(arr), end(arr), val) != end(arr))

vector<vector<int>> poss;
vector<int> found;
vector<int> foundvals;

int binSearch(int bot, int top, int diff) {
	int mid;
	int low = bot, high = top;
	while (low != high) {
		mid = (low+high)/2;
		int res = high;
		if (mid != high)
			res = query(bot, mid);
		if (res == diff) high = mid;
		else low = mid+1;
	}
	return low;
}


void solve(int N) {
	poss.resize(N+1);
	int n = 1;
	int res = binSearch(1, N, N-1);
	poss[res] = {N};
	found.push_back(res);
    answer(res, N);
	foundvals.push_back(N);
	while (n < N) {
		int tmp = 0;
		for (int iii = 0; iii < found.size(); iii++) {
			int i = found[iii];
			if (i != N && poss[i+1].size() == 0) {
				tmp++;
				int low, high;
				int diff = query(i, i+1);
				low = poss[i][0]-diff, high = poss[i][0]+diff;
				int c = 0;
				if (low >= 1 && !CONTAINS(foundvals, low)) {
					c++;
					poss[i+1].push_back(low);
				}
				if (high <= N && !CONTAINS(foundvals, high)) {
					c++;
					poss[i+1].push_back(high);
				}
				if (c == 1) {
                    answer(i+1, poss[i+1][0]);
					found.push_back(i+1);
					foundvals.push_back(poss[i+1][0]);
					n++;
				}
			}
			if (i != 1 && poss[i-1].size() == 0) {
				tmp++;
				int low, high;
				int diff = query(i-1, i);
				low = poss[i][0]-diff, high = poss[i][0]+diff;
				int c = 0;
				if (low >= 1 && !CONTAINS(foundvals, low)) {
					c++;
					poss[i-1].push_back(low);
				}
				if (high <= N && !CONTAINS(foundvals, high)) {
					c++;
					poss[i-1].push_back(high);
				}
				if (c == 1) {
                    answer(i-1, poss[i-1][0]);
					found.push_back(i-1);
					foundvals.push_back(poss[i-1][0]);
					n++;
				}
			}
		}
		if (!tmp) {
			for (int iii = 0; iii < found.size(); iii++) {
			    int i = found[iii];
				if (i != 1 && i != N && (poss[i-1].size() > 1 ^ poss[i+1].size() > 1)) {
					bool below = poss[i-1].size() > 1;
					int res = query(i-1, i+1);
					int i0 = i + (below ? 1 : -1);
					int i0i = abs(poss[i][0] - poss[i + (below ? 1 : -1)][0]);
					int ii1 = abs(poss[i][0] - poss[i + (below ? -1 : 1)][0]);
					int corr;
					if (res == i0i || ii1 == res) {
						if (poss[i0][0] > poss[i][0]) 
							corr = max(poss[i + (below ? -1 : 1)][0], poss[i + (below ? -1 : 1)][1]);
						else corr = min(poss[i + (below ? -1 : 1)][0], poss[i + (below ? -1 : 1)][1]);
						
					}
					else {
						if (poss[i0][0] > poss[i][0]) 
							corr = min(poss[i + (below ? -1 : 1)][0], poss[i + (below ? -1 : 1)][1]);
						else corr = max(poss[i + (below ? -1 : 1)][0], poss[i + (below ? -1 : 1)][1]);
					}
					poss[i + (below ? -1 : 1)].clear();
					poss[i + (below ? -1 : 1)].push_back(corr);
					foundvals.push_back(corr);
					found.push_back(i + (below ? -1 : 1));
                    answer(i + (below ? -1 : 1), corr);
					n++;
					break;
				}
			}
		}
	}
}

컴파일 시 표준 에러 (stderr) 메시지

xylophone.cpp: In function 'void solve(int)':
xylophone.cpp:40:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |   for (int iii = 0; iii < found.size(); iii++) {
      |                     ~~~~^~~~~~~~~~~~~~
xylophone.cpp:86:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |    for (int iii = 0; iii < found.size(); iii++) {
      |                      ~~~~^~~~~~~~~~~~~~
xylophone.cpp:88:47: warning: suggest parentheses around comparison in operand of '^' [-Wparentheses]
   88 |     if (i != 1 && i != N && (poss[i-1].size() > 1 ^ poss[i+1].size() > 1)) {
      |                              ~~~~~~~~~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...