Submission #1186907

#TimeUsernameProblemLanguageResultExecution timeMemory
1186907ByeWorldCatfish Farm (IOI22_fish)C++20
52 / 100
1053 ms508696 KiB
#include "fish.h"
#include <bits/stdc++.h>
#define ll long long
#define fi first 
#define se second
#define pb push_back
using namespace std;
typedef pair<ll,ll> pii;
typedef pair<ll,pii> ipii;
const int MAXN = 5010;
const int MAXA = 3e5+10;
const ll INF = 2e15+10;
void chmx(auto &a, auto b){ a = max(a, b); }
void chmn(auto &a, auto b){ a = min(a, b); }

int n, m;
ll x[MAXA], y[MAXA], w[MAXA], a[MAXN][MAXN];
ll up[MAXN][MAXN], dw[MAXN][MAXN], pr[MAXN][MAXN], 
upmx[MAXN][MAXN], dwmx[MAXN][MAXN];

long long max_weights(int N, int M, std::vector<int> X, std::vector<int> Y,
                      std::vector<int> W) {
	n = N; m = M;
	for(int i=1; i<=m; i++){
		x[i] = X[i-1]+1; y[i] = Y[i-1]+1; w[i] = W[i-1];
		a[x[i]][y[i]] += w[i];
	}
	for(int i=1; i<=n; i++){
		for(int j=1; j<=n; j++) pr[i][j] = pr[i][j-1]+a[i][j];
	}
	
	for(int i=0; i<=n+1; i++)
		for(int j=0; j<=n+1; j++) 
			dw[i][j] = up[i][j] = upmx[i][j] = dwmx[i][j] = -INF;
	dw[0][0] = up[0][0] = 0;
	int i = 0;
		for(int j=0; j<=n; j++){
			upmx[i][j] = max((j==0 ? -INF : upmx[i][j-1]), up[i][j]-pr[i][j] );
		}
		for(int j=n; j>=0; j--){
			dwmx[i][j] = max(dwmx[i][j+1], dw[i][j]+pr[i+1][j] );
		}

	ll ANS = 0;

	for(int i=1; i<=n; i++){
		for(int j=0; j<=n; j++){
			// for(int k=0; k<=j; k++){
			// 	chmx(up[i][j], (up[i-1][k]-pr[i-1][k]) + pr[i-1][j] );
			// }
			// for(int k=j; k<=n; k++){
			// 	chmx(dw[i][j], dw[i-1][k]+pr[i][k] - pr[i][j] );
			// }
			// up[i][j] = up[i-1][k]-pr[i-1][k] + pr[i-1][j];
			up[i][j] = upmx[i-1][j] + pr[i-1][j];
			dw[i][j] = dwmx[i-1][j] - pr[i][j];
		}

		ll MX = 0;
		for(int j=0; j<=n; j++) chmx(MX, max(dw[i-1][j], up[i-1][j]));
		chmx(up[i][0], MX);
		chmx(dw[i][0], MX);

		for(int j=0; j<=n; j++){
			chmx(dw[i][j], up[i][j]);

			chmx(ANS, up[i][j]);
			chmx(ANS, dw[i][j]);
		}

		for(int j=0; j<=n; j++){
			upmx[i][j] = max((j==0 ? 0 : upmx[i][j-1]), up[i][j]-pr[i][j] );
		}
		for(int j=n; j>=0; j--){
			dwmx[i][j] = max(dwmx[i][j+1], dw[i][j]+pr[i+1][j] );
		}
	}
	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...