답안 #360199

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
360199 2021-01-27T18:04:40 Z dimashii 3단 점프 (JOI19_jumps) C++17
0 / 100
126 ms 25964 KB
#include <bits/stdc++.h>

#define f first
#define s second

#define ll long long

using namespace std;

const int mxN = 5e5 + 5;

int n, a[mxN];

vector <int> pos[mxN];

pair <int, int> t[mxN * 4];

void Build(int v = 1, int L = 1, int R = n) {
	if (L == R) {
		t[v] = {a[L], -1};
		return;
	}
	int M = (L + R) / 2;
	Build(v * 2, L, M);
	Build(v * 2 + 1, M + 1, R);
	if (t[v * 2].f >= t[v * 2 + 1].f)
		t[v] = {t[v * 2].f, max(t[v * 2].s, t[v * 2 + 1].f)};
	else
		t[v] = {t[v * 2 + 1].f, max(t[v * 2 + 1].s, t[v * 2].f)};
}

pair <int, int> Get(int l, int r, int v = 1, int L = 1, int R = n) {
	if (l <= L && R <= r)
		return t[v];
	if (l > R || r < L)
		return {-1, -1};
	int M = (L + R) / 2;
	auto left = Get(l, r, v * 2, L, M);
	auto right = Get(l, r, v * 2 + 1, M + 1, R);
	if (left.f >= right.f)
		return {left.f, max(left.s, right.f)};
	return {right.f, max(right.s, left.f)};
}

int main() {
	ios :: sync_with_stdio(false), cin.tie(nullptr);
	cin >> n;
	vector <int> vec;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		vec.push_back(a[i]);
	}
	sort(vec.begin(), vec.end());
	for (int i = 1; i <= n; ++i) {
		int x = lower_bound(vec.begin(), vec.end(), a[i]) - vec.begin();
		pos[x].push_back(i);
	}
	Build();
	int q;
	cin >> q;
	while (q--) {
		int l, r;
		cin >> l >> r;
		auto opt = Get(l, r);
		ll ans = 0;
		int x = lower_bound(vec.begin(), vec.end(), opt.f) - vec.begin();
		int y = lower_bound(vec.begin(), vec.end(), opt.s) - vec.begin();
		{ // max R <= r
			int R = pos[x][upper_bound(pos[x].begin(), pos[x].end(), r) - pos[x].begin() - 1];
			R = max(R, pos[y][upper_bound(pos[y].begin(), pos[y].end(), r) - pos[y].begin() - 1]);
			{ // middle, mid < R
				int mid;
				if (a[R] == opt.f) 
					mid = pos[y][lower_bound(pos[y].begin(), pos[y].end(), R) - pos[y].begin() - 1];
				else
					mid = pos[x][lower_bound(pos[x].begin(), pos[x].end(), R) - pos[x].begin() - 1];
				// now I should find optimal L
				int lb = max(l, mid - (R - mid)), rb = mid - 1;
				if (rb >= lb) 
					ans = 1ll * Get(lb, rb).f + opt.f + opt.s;
			}
			{ // min L >= l
				int L;
				if (a[R] == opt.f)
					L = pos[y][lower_bound(pos[y].begin(), pos[y].end(), l) - pos[y].begin()];
				else
					L = pos[x][lower_bound(pos[x].begin(), pos[x].end(), l) - pos[x].begin()];
				// now I should find optimal mid
				// R - mid >= mid - L
				// R + L >= 2 * mid
				int lb = L + 1, rb = (L + R) / 2;
				if (rb >= lb) 
					ans = max(ans, 1ll * Get(lb, rb).f + opt.f + opt.s);
			}
		}
		{ // min L >= l
			int L = pos[y][lower_bound(pos[y].begin(), pos[y].end(), l) - pos[y].begin()];
			L = min(L, pos[x][lower_bound(pos[x].begin(), pos[x].end(), l) - pos[x].begin()]);
			{ // middle, mid >= L
				int mid;
				if (a[L] == opt.f) 
					mid = pos[y][upper_bound(pos[y].begin(), pos[y].end(), L) - pos[y].begin()];
				else
					mid = pos[x][upper_bound(pos[x].begin(), pos[x].end(), L) - pos[x].begin()];
				// now I should find optimal 
				// R - mid >= L - mid
				int lb = mid + (mid - L), rb = r;
				if (rb >= lb) 
					ans = max(ans, 1ll * Get(lb, rb).f + opt.f + opt.s);
			}
			{ // max R <= r
				int R;
				if (a[R] == opt.f)
					R = pos[y][upper_bound(pos[y].begin(), pos[y].end(), r) - pos[y].begin() - 1];
				else
					R = pos[x][upper_bound(pos[x].begin(), pos[x].end(), r) - pos[x].begin() - 1];
				// now I should find optimal mid
				// R - mid >= mid - L
				// R + L >= 2 * mid
				int lb = L + 1, rb = (L + R) / 2;
				if (rb >= lb) 
					ans = max(ans, 1ll * Get(lb, rb).f + opt.f + opt.s);
			}
		}
		cout << ans << '\n';		
	}
	return 0;
}

Compilation message

jumps.cpp: In function 'int main()':
jumps.cpp:113:12: warning: 'R' may be used uninitialized in this function [-Wmaybe-uninitialized]
  113 |     if (a[R] == opt.f)
      |         ~~~^
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12140 KB Output is correct
2 Incorrect 9 ms 12140 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12140 KB Output is correct
2 Incorrect 9 ms 12140 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 123 ms 24168 KB Output is correct
2 Correct 62 ms 25832 KB Output is correct
3 Correct 61 ms 25832 KB Output is correct
4 Incorrect 126 ms 25964 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12140 KB Output is correct
2 Incorrect 9 ms 12140 KB Output isn't correct
3 Halted 0 ms 0 KB -