답안 #1005228

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1005228 2024-06-22T09:08:11 Z alex_2008 메기 농장 (IOI22_fish) C++17
44 / 100
374 ms 891696 KB
//#include "fish.h"
#include <iostream>
#include <cmath>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX_N = 3e2 + 10;
const int M = 4e5 + 10;
ll col_sm[MAX_N][MAX_N];
ll dp[MAX_N][MAX_N][MAX_N];
ll dp_pref[MAX_N][MAX_N][MAX_N];
ll dp_suff[MAX_N][MAX_N][MAX_N];
ll pref_mx[MAX_N][MAX_N][MAX_N];
ll dpp[MAX_N][MAX_N][MAX_N];
ll esim[M][2][2];
ll f(int r, int c) {
	if (r == -1) return 0;
	return col_sm[r][c];
}
ll sm(int c, int r1, int r2) {
	return f(c, r2) - f(c, r1 - 1);
}
ll max_weights(int N, int M, vector<int> X, vector<int> Y, vector<int> W) {
	if (N <= 300) {
		for (int i = 0; i < M; i++) {
			col_sm[X[i]][Y[i]] = W[i];
		}
		for (int i = 0; i <= N; i++) {
			for (int j = 0; j <= N; j++) {
				col_sm[i][j] += col_sm[i][j - 1];
			}
		}
		for (int h1 = 0; h1 <= N; h1++) {
			for (int h2 = 0; h2 <= N; h2++) {
				if (h1 >= h2) dp[1][h1][h2] = sm(1, h2, h1 - 1);
				else dp[1][h1][h2] = sm(0, h1, h2 - 1);

			}
		}
		for (int h1 = 0; h1 <= N; h1++) {
			for (int h2 = 0; h2 <= N; h2++) {
				pref_mx[1][h1][h2] = max(dp[1][h1][h2], pref_mx[1][h1 - 1][h2]);
				if (h1 >= h2) {
					dp_pref[1][h1][h2] = max(dp_pref[1][h1 - 1][h2], dp[1][h1][h2] - sm(1, h2, h1 - 1));
				}
			}
		}
		for (int h1 = N; h1 >= 0; h1--) {
			for (int h2 = 0; h2 <= h1; h2++) {
				dp_suff[1][h1][h2] = max(dp[1][h1][h2], dp_suff[1][h1 + 1][h2]);
			}
		}
		for (int i = 2; i < N; i++) {
			for (int h1 = 0; h1 <= N; h1++) {
				for (int h2 = 0; h2 <= N; h2++) {
					if (h1 >= h2) {
						dp[i][h1][h2] = pref_mx[i - 1][N][h1] + sm(i, h2, h1 - 1);
					}
					else {
						dp[i][h1][h2] = pref_mx[i - 1][h1][h1] + sm(i - 1, h1, h2 - 1);
						dp[i][h1][h2] = max(dp[i][h1][h2], dp_suff[i - 1][h2][h1]);
						dp[i][h1][h2] = max(dp[i][h1][h2], dp_pref[i - 1][h2][h1] + sm(i - 1, h1, h2 - 1));
					}
				}
			}
			for (int h1 = 0; h1 <= N; h1++) {
				for (int h2 = 0; h2 <= N; h2++) {
					pref_mx[i][h1][h2] = max(dp[i][h1][h2], pref_mx[i][h1 - 1][h2]);
					if (h1 >= h2) {
						dp_pref[i][h1][h2] = max(dp_pref[i][h1 - 1][h2], dp[i][h1][h2] - sm(i, h2, h1 - 1));
					}
				}
			}
			for (int h1 = N; h1 >= 0; h1--) {
				for (int h2 = 0; h2 <= h1; h2++) {
					dp_suff[i][h1][h2] = max(dp[i][h1][h2], dp_suff[i][h1 + 1][h2]);
				}
			}
		}
		ll mx = 0;
		for (int h1 = 0; h1 <= N; h1++) {
			for (int h2 = 0; h2 <= N; h2++) {
				mx = max(mx, dp[N - 1][h1][h2]);
			}
		}
		return mx;
	}
	bool ch = true;
	ll sm = 0;
	for (int i = 0; i < M; i++) {
		if (X[i] % 2 == 1) {
			ch = false;
		}
		sm += W[i];
	}
	if (ch) return sm;
	bool ch2 = true;
	for (int i = 0; i < M; i++) {
		if (X[i] > 1) ch2 = false;
	}
	if (ch2) {
		bool ch0 = false, ch1 = false;
		for (int i = 0; i < M; i++) {
			if (X[i] == 0) ch0 = true;
			else ch1 = true;
		}
		if (!ch1 || !ch0) return sm;
		sm = 0;
		map <pair<int, int>, int> mp;
		for (int i = 0; i < M; i++) {
			mp[{ X[i], Y[i] }] = W[i];
			if (X[i] == 1) sm += W[i];
		}
		ll ans = sm;
		for (int i = 0; i < N; i++) {
			sm -= mp[{ 1, i }];
			sm += mp[{ 0, i }];
			ans = max(ans, sm);
		}
		return ans;
	}
	map <pair<int, int>, int> mp;
	for (int i = 0; i < M; i++) {
		mp[{ X[i], Y[i] }] = W[i];
	}
	esim[1][0][0] = 0;
	esim[1][0][1] = mp[{ 0, 0 }];
	esim[1][1][0] = mp[{ 1, 0 }];
	esim[1][1][1] = 0;
	for (int i = 2; i < N; i++) {
		esim[i][0][0] = max(esim[i - 1][1][0], esim[i - 1][0][0]);
		esim[i][1][1] = max(esim[i - 1][1][1], esim[i - 1][0][1]);
		esim[i][0][1] = max(esim[i - 1][1][0], esim[i][0][0] + mp[{ i - 1, 0 }]);
		esim[i][1][0] = max(esim[i - 1][0][1], esim[i - 1][1][1]) + mp[{ i, 0 }];
	}
	return max({ esim[N - 1][0][0], esim[N - 1][0][1],
		esim[N - 1][1][0], esim[N - 1][1][1] });
}
/*
int main() {
	//3 2
	//0 0 1
	//1 1 1
	//cout << max_weights(3, 2, { 0, 1 }, { 0, 1 }, { 1, 1 });
	
}
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 2140 KB Output is correct
2 Correct 22 ms 4548 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 56 ms 13652 KB Output is correct
6 Correct 58 ms 13924 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 90 ms 15448 KB Output is correct
3 Correct 114 ms 21100 KB Output is correct
4 Correct 17 ms 3932 KB Output is correct
5 Correct 17 ms 4444 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 0 ms 2396 KB Output is correct
8 Correct 1 ms 2392 KB Output is correct
9 Correct 0 ms 2396 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 0 ms 348 KB Output is correct
12 Correct 14 ms 3708 KB Output is correct
13 Correct 18 ms 4312 KB Output is correct
14 Correct 58 ms 14972 KB Output is correct
15 Correct 71 ms 16464 KB Output is correct
16 Correct 56 ms 14932 KB Output is correct
17 Correct 62 ms 16468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 26 ms 10844 KB Output is correct
3 Incorrect 39 ms 12372 KB 1st lines differ - on the 1st token, expected: '21261825233649', found: '32717839057000'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4700 KB Output is correct
2 Correct 1 ms 9052 KB Output is correct
3 Correct 1 ms 2396 KB Output is correct
4 Correct 0 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 67 ms 339236 KB Output is correct
10 Correct 323 ms 888368 KB Output is correct
11 Correct 80 ms 339284 KB Output is correct
12 Correct 326 ms 888628 KB Output is correct
13 Correct 25 ms 121692 KB Output is correct
14 Correct 342 ms 888680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4700 KB Output is correct
2 Correct 1 ms 9052 KB Output is correct
3 Correct 1 ms 2396 KB Output is correct
4 Correct 0 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 67 ms 339236 KB Output is correct
10 Correct 323 ms 888368 KB Output is correct
11 Correct 80 ms 339284 KB Output is correct
12 Correct 326 ms 888628 KB Output is correct
13 Correct 25 ms 121692 KB Output is correct
14 Correct 342 ms 888680 KB Output is correct
15 Correct 351 ms 888660 KB Output is correct
16 Correct 25 ms 121944 KB Output is correct
17 Correct 363 ms 890196 KB Output is correct
18 Correct 345 ms 890080 KB Output is correct
19 Correct 358 ms 890192 KB Output is correct
20 Correct 337 ms 890192 KB Output is correct
21 Correct 341 ms 890220 KB Output is correct
22 Correct 374 ms 891696 KB Output is correct
23 Correct 352 ms 888900 KB Output is correct
24 Correct 338 ms 889812 KB Output is correct
25 Correct 364 ms 888660 KB Output is correct
26 Correct 363 ms 888912 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4700 KB Output is correct
2 Correct 1 ms 9052 KB Output is correct
3 Correct 1 ms 2396 KB Output is correct
4 Correct 0 ms 2396 KB Output is correct
5 Correct 0 ms 2396 KB Output is correct
6 Correct 0 ms 2396 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 67 ms 339236 KB Output is correct
10 Correct 323 ms 888368 KB Output is correct
11 Correct 80 ms 339284 KB Output is correct
12 Correct 326 ms 888628 KB Output is correct
13 Correct 25 ms 121692 KB Output is correct
14 Correct 342 ms 888680 KB Output is correct
15 Correct 351 ms 888660 KB Output is correct
16 Correct 25 ms 121944 KB Output is correct
17 Correct 363 ms 890196 KB Output is correct
18 Correct 345 ms 890080 KB Output is correct
19 Correct 358 ms 890192 KB Output is correct
20 Correct 337 ms 890192 KB Output is correct
21 Correct 341 ms 890220 KB Output is correct
22 Correct 374 ms 891696 KB Output is correct
23 Correct 352 ms 888900 KB Output is correct
24 Correct 338 ms 889812 KB Output is correct
25 Correct 364 ms 888660 KB Output is correct
26 Correct 363 ms 888912 KB Output is correct
27 Incorrect 2 ms 976 KB 1st lines differ - on the 1st token, expected: '2999', found: '1'
28 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 26 ms 10844 KB Output is correct
3 Incorrect 39 ms 12372 KB 1st lines differ - on the 1st token, expected: '21261825233649', found: '32717839057000'
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 14 ms 2140 KB Output is correct
2 Correct 22 ms 4548 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 56 ms 13652 KB Output is correct
6 Correct 58 ms 13924 KB Output is correct
7 Correct 1 ms 4440 KB Output is correct
8 Correct 90 ms 15448 KB Output is correct
9 Correct 114 ms 21100 KB Output is correct
10 Correct 17 ms 3932 KB Output is correct
11 Correct 17 ms 4444 KB Output is correct
12 Correct 0 ms 2396 KB Output is correct
13 Correct 0 ms 2396 KB Output is correct
14 Correct 1 ms 2392 KB Output is correct
15 Correct 0 ms 2396 KB Output is correct
16 Correct 0 ms 348 KB Output is correct
17 Correct 0 ms 348 KB Output is correct
18 Correct 14 ms 3708 KB Output is correct
19 Correct 18 ms 4312 KB Output is correct
20 Correct 58 ms 14972 KB Output is correct
21 Correct 71 ms 16464 KB Output is correct
22 Correct 56 ms 14932 KB Output is correct
23 Correct 62 ms 16468 KB Output is correct
24 Correct 0 ms 348 KB Output is correct
25 Correct 26 ms 10844 KB Output is correct
26 Incorrect 39 ms 12372 KB 1st lines differ - on the 1st token, expected: '21261825233649', found: '32717839057000'
27 Halted 0 ms 0 KB -