Submission #1231946

#TimeUsernameProblemLanguageResultExecution timeMemory
1231946lolokaCatfish Farm (IOI22_fish)C++20
32 / 100
118 ms190632 KiB
#include "fish.h"
#include<bits/stdc++.h>
using namespace std;
long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y, std::vector<int> W) {
	bool f1 = 1, f2 = 1, f3 = 1;
     for(int i = 0; i < M; i++) {
     	f1 &= (X[i] % 2 == 0);
     	f2 &= (X[i] <= 1);
     	f3 &= (Y[i] == 0);
     }
     if(f1) {
     	long long ans = 0;
     	for(int i = 0; i < M; i++) ans += W[i];
     	return ans;
     }
     if(f2) {
     	long long pr[2][N + 1];
     	for(int i = 0; i < N + 1; i++) pr[0][i] = pr[1][i] = 0;
     	for(int i = 0; i < M; i++) pr[X[i] % 2][Y[i] + 1] = W[i];
     	for(int i = 1; i <= N; i++) pr[0][i] += pr[0][i - 1], pr[1][i] += pr[1][i - 1];
     	long long ans = 0;
     	for(int i = 1; i <= N; i++) ans = max(ans, pr[0][i - 1] + pr[1][N] - pr[1][i - 1]);
     	if(N == 2) return max(pr[0][N], pr[1][N]);
     	return ans;
     }
     if(f3) {
     	long long dp[2][2][N + 1], mp[N + 1];
     	for(int i = 0; i < N + 1; i++) dp[0][0][i] = dp[0][1][i] = dp[1][0][i] = dp[1][1][i] = mp[i] = 0;
     	for(int i = 0; i < M; i++) mp[X[i] + 1] = W[i];
     	dp[0][1][2] = mp[1];
     	dp[1][0][2] = mp[2];
     	for(int i = 3; i <= N; i++) {
     		for(int j1 = 0; j1 < 2; j1++) {
     			for(int j2 = 0; j2 < 2; j2++) {
     				for(int j3 = 0; j3 < 2; j3++) {
     					long long x = dp[j1][j2][i - 1];
     					if(j1 == 0 && j2 == 0 && j3 == 1) x += mp[i - 1];
     					if(j2 == 1 && j3 == 0) x += mp[i];
     					dp[j2][j3][i] = max(dp[j2][j3][i], x);
     				}
     			}
     		}
     	}
     	return max({dp[0][0][N], dp[0][1][N], dp[1][0][N], dp[1][1][N]});
     }
     int H = 15;
     long long pr[N + 1][H], dp[N + 1][H][H];
     for(int i = 0; i < N + 1; i++) {
     	for(int j = 0; j < H; j++) {
     		for(int z = 0; z < H; z++) dp[i][j][z] = 0;
     		pr[i][j] = 0;
     	}
     }
     for(int i = 0; i < M; i++) pr[X[i] + 1][Y[i] + 1] = W[i];
     for(int i = 0; i < N + 1; i++) {
     	for(int j = 1; j < H; j++) pr[i][j] += pr[i][j - 1];
     }
     for(int x1 = 0; x1 < H; x1++) {
     	for(int x2 = 0; x2 < H; x2++) {
     		dp[2][x1][x2] = max(0ll, pr[1][x2] - pr[1][x1]) + max(0ll, pr[2][x1] - pr[2][x2]);
     	}
     }
     for(int i = 3; i <= N; i++) {
     	for(int x1 = 0; x1 < H; x1++) {
     		for(int x2 = 0; x2 < H; x2++) {
     			for(int x3 = 0; x3 < H; x3++) {
     				dp[i][x2][x3] = max(dp[i][x2][x3], dp[i - 1][x1][x2] + 
     				max(0ll, pr[i - 1][x3] - pr[i - 1][max(x1, x2)]) + max(0ll, pr[i][x2] - pr[i][x3]));
     			}
     		}
     	}
     }
     long long ans = 0;
     for(int x1 = 0; x1 < H; x1++) {
     	for(int x2 = 0; x2 < H; x2++) ans = max(ans, dp[N][x1][x2]);
     }
     return ans;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...