Submission #925842

#TimeUsernameProblemLanguageResultExecution timeMemory
925842mickey080929Abduction 2 (JOI17_abduction2)C++17
100 / 100
854 ms152176 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

ll H, W, Q;
map<ll,ll> memo;
ll mxl[50010][16], mxr[50010][16], mxu[50010][16], mxd[50010][16];
ll A[50010], B[50010];

ll dfs(ll x, ll y, ll dir) {
	if (memo.find(x*W*2 + y*2 + dir) != memo.end()) return memo[x*W*2 + y*2 + dir];
	ll cur = 0;
	if (dir == 0) {
		ll u = x - 1, d = x + 1;
		for (ll lv=15; lv>=0; lv--) {
			if (u - (1 << lv) >= -1 && mxu[u][lv] < B[y])
				u -= (1 << lv);
			if (d + (1 << lv) <= H && mxd[d][lv] < B[y])
				d += (1 << lv);
		}
		if (u != -1) cur = max(cur, dfs(u, y, 1) + x - u);
		else cur = max(cur, x);
		if (d != H) cur = max(cur, dfs(d, y, 1) + d - x);
		else cur = max(cur, H - x - 1);
	}
	else {
		ll l = y - 1, r = y + 1; 
		for (ll lv=15; lv>=0; lv--) {
			if (l - (1 << lv) >= -1 && mxl[l][lv] < A[x])
				l -= (1 << lv);
			if (r + (1 << lv) <= W && mxr[r][lv] < A[x])
				r += (1 << lv);
		}
		if (l != -1) cur = max(cur, dfs(x, l, 0) + y - l);
		else cur = max(cur, y);
		if (r != W) cur = max(cur, dfs(x, r, 0) + r - y);
		else cur = max(cur, W - y - 1);
	}
	memo[x*W*2 + y*2 + dir] = cur;
	return cur;
}

int main() {
	ios_base :: sync_with_stdio(false); cin.tie(NULL); 
	cin >> H >> W >> Q;
	for (ll i=0; i<H; i++) {
		cin >> A[i];
		mxu[i][0] = mxd[i][0] = A[i];
	}
	for (ll i=0; i<W; i++) {
		cin >> B[i];
		mxl[i][0] = mxr[i][0] = B[i];
	}
	for (ll lv=1; lv<=15; lv++) {
		for (ll i=0; i<H; i++) {
			if (i - (1 << lv) >= -1)
				mxu[i][lv] = max(mxu[i][lv-1], mxu[i-(1<<(lv-1))][lv-1]);
			if (i + (1 << lv) <= H)
				mxd[i][lv] = max(mxd[i][lv-1], mxd[i+(1<<(lv-1))][lv-1]);
		}
	}
	for (ll lv=1; lv<=15; lv++) {
		for (ll i=0; i<W; i++) {
			if (i - (1 << lv) >= -1)
				mxl[i][lv] = max(mxl[i][lv-1], mxl[i-(1<<(lv-1))][lv-1]);
			if (i + (1 << lv) <= W)
				mxr[i][lv] = max(mxr[i][lv-1], mxr[i+(1<<(lv-1))][lv-1]);
		}
	}
	while (Q --) {
		ll x, y;
		cin >> x >> y;
		x --; y --;
		cout << max(dfs(x, y, 0), dfs(x, y, 1)) << '\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...