답안 #551927

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
551927 2022-04-21T22:29:50 Z LucaDantas 유괴 2 (JOI17_abduction2) C++17
100 / 100
2096 ms 131260 KB
#include <bits/stdc++.h>
using namespace std;

constexpr int maxn = 50010, inf = 0x3f3f3f3f;

int A[maxn], B[maxn], R, C;

int find_first_A(int id, int val) { int i; for(i = id+1; A[i] < val; i++); return i; }
int find_first_B(int id, int val) { int i; for(i = id+1; B[i] < val; i++); return i; }

int find_last_A(int id, int val) { int i; for(i = id-1; A[i] < val; i--); return i; }
int find_last_B(int id, int val) { int i; for(i = id-1; B[i] < val; i--); return i; }

int find_first(int lim_id, int lim_val, bool k) { return k == 0 ? find_first_A(lim_id, lim_val) : find_first_B(lim_id, lim_val); }
int find_last(int lim_id, int lim_val, bool k) { return k == 0 ? find_last_A(lim_id, lim_val) : find_last_B(lim_id, lim_val); }

map<int, long long> dp[maxn][2];

long long go(int r, int c, bool k) {
	if(dp[r][k].count(c))
		return dp[r][k][c];

	int procurar = k == 0 ? r : c, eu = k == 0 ? c : r;
	int p1 = find_last(procurar, k == 0 ? B[eu] : A[eu], k), d1 = procurar - p1, v1 = k == 0 ? A[p1] : B[p1]; // ultimo cara vertical com indice menor que c e valor maior que A[r]
	int p2 = find_first(procurar, k == 0 ? B[eu] : A[eu], k), d2 = p2 - procurar, v2 = k == 0 ? A[p2] : B[p2]; // primeiro cara vertical com indice maior que c e valor maior que A[r]
	
	if(v1 > v2) // quero manter a invariante de que v1 < v2 pra ficar mais fácil de calcular as coisas
		swap(p1, p2), swap(d1, d2), swap(v1, v2);

	// subtraio 1 dos infinitos porque eu defini eles como o primeiro ponto fora do grid (0 ou R+1/C+1), então a distância deles fica 1 a mais doq pode
	if(v1 == inf)
		return dp[r][k][c] = max(d1, d2)-1; // cheguei ao fim indo pra algum dos lados, escolho o maior obviamente
	if(v2 == inf)
		return dp[r][k][c] = max(d1 + (k == 0 ? go(p1, c, 1) : go(r, p1, 0)), (long long) d2-1); // cheguei ao fim indo pro maior mas não cheguei indo pro menor, então pego o melhor entre os dois

	// brutao pq meu guloso ta dando errado
	return dp[r][k][c] = max((long long) d1 + (k == 0 ? go(p1, c, !k) : go(r, p1, !k)), (long long) d2 + (k == 0 ? go(p2, c, !k) : go(r, p2, !k)));
}

int main() {
	int q; scanf("%d %d %d", &R, &C, &q);
	for(int i = 1; i <= R; i++)
		scanf("%d", &A[i]);
	for(int i = 1; i <= C; i++)
		scanf("%d", &B[i]);
	A[0] = A[R+1] = B[0] = B[C+1] = inf;
	while(q--) {
		int r, c; scanf("%d %d", &r, &c);
		printf("%lld\n", max(go(r, c, 0), go(r, c, 1)));
	}
}

Compilation message

abduction2.cpp: In function 'int main()':
abduction2.cpp:41:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   41 |  int q; scanf("%d %d %d", &R, &C, &q);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
abduction2.cpp:43:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   43 |   scanf("%d", &A[i]);
      |   ~~~~~^~~~~~~~~~~~~
abduction2.cpp:45:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |   scanf("%d", &B[i]);
      |   ~~~~~^~~~~~~~~~~~~
abduction2.cpp:48:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |   int r, c; scanf("%d %d", &r, &c);
      |             ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4948 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 3 ms 4948 KB Output is correct
11 Correct 2 ms 4948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4948 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 3 ms 4948 KB Output is correct
11 Correct 2 ms 4948 KB Output is correct
12 Correct 3 ms 4948 KB Output is correct
13 Correct 3 ms 4960 KB Output is correct
14 Correct 3 ms 4948 KB Output is correct
15 Correct 3 ms 4948 KB Output is correct
16 Correct 3 ms 4948 KB Output is correct
17 Correct 3 ms 4948 KB Output is correct
18 Correct 4 ms 4948 KB Output is correct
19 Correct 5 ms 5204 KB Output is correct
20 Correct 5 ms 5212 KB Output is correct
21 Correct 5 ms 5228 KB Output is correct
22 Correct 6 ms 5468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4948 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 3 ms 4948 KB Output is correct
11 Correct 2 ms 4948 KB Output is correct
12 Correct 3 ms 4948 KB Output is correct
13 Correct 3 ms 4960 KB Output is correct
14 Correct 3 ms 4948 KB Output is correct
15 Correct 3 ms 4948 KB Output is correct
16 Correct 3 ms 4948 KB Output is correct
17 Correct 3 ms 4948 KB Output is correct
18 Correct 4 ms 4948 KB Output is correct
19 Correct 5 ms 5204 KB Output is correct
20 Correct 5 ms 5212 KB Output is correct
21 Correct 5 ms 5228 KB Output is correct
22 Correct 6 ms 5468 KB Output is correct
23 Correct 13 ms 5588 KB Output is correct
24 Correct 14 ms 5580 KB Output is correct
25 Correct 14 ms 5588 KB Output is correct
26 Correct 13 ms 5528 KB Output is correct
27 Correct 13 ms 5588 KB Output is correct
28 Correct 397 ms 10644 KB Output is correct
29 Correct 86 ms 6240 KB Output is correct
30 Correct 977 ms 11544 KB Output is correct
31 Correct 1130 ms 13284 KB Output is correct
32 Correct 86 ms 5932 KB Output is correct
33 Correct 377 ms 7312 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 5204 KB Output is correct
2 Correct 3 ms 5076 KB Output is correct
3 Correct 4 ms 5076 KB Output is correct
4 Correct 4 ms 5076 KB Output is correct
5 Correct 4 ms 5188 KB Output is correct
6 Correct 4 ms 5180 KB Output is correct
7 Correct 4 ms 5244 KB Output is correct
8 Correct 6 ms 5460 KB Output is correct
9 Correct 6 ms 5460 KB Output is correct
10 Correct 6 ms 5332 KB Output is correct
11 Correct 7 ms 5460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 3 ms 4948 KB Output is correct
6 Correct 2 ms 4948 KB Output is correct
7 Correct 2 ms 4948 KB Output is correct
8 Correct 2 ms 4948 KB Output is correct
9 Correct 2 ms 4948 KB Output is correct
10 Correct 3 ms 4948 KB Output is correct
11 Correct 2 ms 4948 KB Output is correct
12 Correct 3 ms 4948 KB Output is correct
13 Correct 3 ms 4960 KB Output is correct
14 Correct 3 ms 4948 KB Output is correct
15 Correct 3 ms 4948 KB Output is correct
16 Correct 3 ms 4948 KB Output is correct
17 Correct 3 ms 4948 KB Output is correct
18 Correct 4 ms 4948 KB Output is correct
19 Correct 5 ms 5204 KB Output is correct
20 Correct 5 ms 5212 KB Output is correct
21 Correct 5 ms 5228 KB Output is correct
22 Correct 6 ms 5468 KB Output is correct
23 Correct 13 ms 5588 KB Output is correct
24 Correct 14 ms 5580 KB Output is correct
25 Correct 14 ms 5588 KB Output is correct
26 Correct 13 ms 5528 KB Output is correct
27 Correct 13 ms 5588 KB Output is correct
28 Correct 397 ms 10644 KB Output is correct
29 Correct 86 ms 6240 KB Output is correct
30 Correct 977 ms 11544 KB Output is correct
31 Correct 1130 ms 13284 KB Output is correct
32 Correct 86 ms 5932 KB Output is correct
33 Correct 377 ms 7312 KB Output is correct
34 Correct 4 ms 5204 KB Output is correct
35 Correct 3 ms 5076 KB Output is correct
36 Correct 4 ms 5076 KB Output is correct
37 Correct 4 ms 5076 KB Output is correct
38 Correct 4 ms 5188 KB Output is correct
39 Correct 4 ms 5180 KB Output is correct
40 Correct 4 ms 5244 KB Output is correct
41 Correct 6 ms 5460 KB Output is correct
42 Correct 6 ms 5460 KB Output is correct
43 Correct 6 ms 5332 KB Output is correct
44 Correct 7 ms 5460 KB Output is correct
45 Correct 20 ms 5844 KB Output is correct
46 Correct 20 ms 5832 KB Output is correct
47 Correct 18 ms 5868 KB Output is correct
48 Correct 17 ms 5920 KB Output is correct
49 Correct 20 ms 5880 KB Output is correct
50 Correct 482 ms 10156 KB Output is correct
51 Correct 451 ms 10836 KB Output is correct
52 Correct 1345 ms 15720 KB Output is correct
53 Correct 1269 ms 15556 KB Output is correct
54 Correct 1244 ms 14840 KB Output is correct
55 Correct 1776 ms 19528 KB Output is correct
56 Correct 2096 ms 131260 KB Output is correct
57 Correct 730 ms 38636 KB Output is correct
58 Correct 690 ms 36808 KB Output is correct
59 Correct 682 ms 36552 KB Output is correct