Submission #815794

#TimeUsernameProblemLanguageResultExecution timeMemory
815794beabossNafta (COI15_nafta)C++14
100 / 100
362 ms114560 KiB
// Source: https://oj.uz/problem/view/COI15_nafta

#include "bits/stdc++.h"

using namespace std;

#define s second
#define f first
#define pb push_back

typedef long long ll;

typedef pair<int, int> pii;
typedef vector<pii> vpii;

typedef vector<int> vi;

#define FOR(i, a, b) for (int i = (a); i<b; i++)

const int N = 2001;

int r, s;

int a[N][N];
bool vis[N][N];

vpii events[N];
int st[N];

int miny, maxy, cost;

int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};

int contr[N];
int overlap[N][N];

int dp[N][N];

int ans[N];

void compute(int l, int r, int j, int optl, int optr) {
	if (l > r) return;
	int i = (l + r) / 2;
	int cur_opt;
	int best = 0;
	
	for (int k = optl; k <= min(i, optr); k++) {
		if (dp[k][j-1] - overlap[k][i] >= best) {
			best = dp[k][j-1] - overlap[k][i];
			cur_opt = k;
		}
	}

	dp[i][j] = best + contr[i];

	ans[j] = max(dp[i][j], ans[j]);

	compute(l, i - 1, j,  optl, cur_opt);
	compute(i+1, r, j, cur_opt, optr);

}

void solve(int x, int y) {
	// cout << x << y << endl;
	miny = min(miny, y);
	maxy = max(maxy, y);
	cost += a[x][y];
	vis[x][y] = true;

	for (int i = 0; i < 4; i++) {
		int newx = x + dx[i];
		int newy = y + dy[i];

		if (newx >= 0 && newx < r && newy >= 0 && newy < s && !vis[newx][newy] && a[newx][newy] != -1) solve(newx, newy);

	}	
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	// input
	cin >> r >> s;

	FOR(i, 0, r) {
		FOR(j, 0, s) {
			char inp;
			cin >> inp;
			if (inp == '.') a[i][j] = -1;
			else a[i][j] = inp - '0';
		}
	}

	// extract components
	FOR(i, 0, r) FOR(j, 0, s) {
		if (!vis[i][j] && a[i][j] != -1) {
			maxy = j;
			miny = j;
			cost = 0;
			solve(i, j);
			events[miny].pb({miny, cost});
			events[maxy+1].pb({miny, -cost});
			FOR(i, miny, maxy + 1) {
				dp[i][0] += cost;
				contr[i] += cost;
				ans[0] = max(ans[0],dp[i][0]);
			}
		}
	}

	// get overlap
	FOR(i, 0, s) {
		for (auto val: events[i]) st[val.f] += val.s;
		int cur_count = 0;
		FOR(j, 0, i + 1) {
			cur_count += st[j];
			overlap[j][i] = cur_count;
		}

	}


	cout << ans[0] << endl;
	FOR(i, 1, s) {
		compute(0, s-1, i, 0, s-1);
		cout << ans[i] << endl;
	}




}












Compilation message (stderr)

nafta.cpp: In function 'void compute(int, int, int, int, int)':
nafta.cpp:59:9: warning: 'cur_opt' may be used uninitialized in this function [-Wmaybe-uninitialized]
   59 |  compute(l, i - 1, j,  optl, cur_opt);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...