제출 #1310153

#제출 시각아이디문제언어결과실행 시간메모리
1310153Jawad_Akbar_JJNafta (COI15_nafta)C++20
100 / 100
310 ms53172 KiB
#include <iostream>
#include <queue>

using namespace std;
const int N = 8<<8;
int dp[N][N], Cst[N][N], seen[N][N], Mn, Mx, Sm, n, m;
string s[N];

void bfs(int r, int c){
	queue<pair<int, int>> Q;
	Q.push({r, c});
	seen[r][c] = 1;

	while (Q.size() > 0){
		auto [i, j] = Q.front();
		Q.pop();
		if (s[i][j] == '.')
			continue;
		Mn = min(Mn, j);
		Mx = max(Mx, j);

		Sm += s[i][j] - '0';
		if (i - 1 > 0 and seen[i-1][j] == 0)
			seen[i-1][j] = 1, Q.push({i-1, j});
		if (i + 1 <= n and seen[i+1][j] == 0)
			seen[i+1][j] = 1, Q.push({i+1, j});
		if (j - 1 > 0 and seen[i][j-1] == 0)
			seen[i][j-1] = 1, Q.push({i, j-1});
		if (j + 1 <= m and seen[i][j+1] == 0)
			seen[i][j+1] = 1, Q.push({i, j+1});
	}
}

void solve(int st, int en, int l, int r, int k){
	if (st > en)
		return;
	int bst = l, mx = 0, mid = (st + en) / 2;
	for (int i=l;i<=min(mid - 1, r);i++){
		if (dp[i][k-1] + Cst[mid][mid] - Cst[i][mid] > mx)
			mx = dp[i][k-1] + Cst[mid][mid] - Cst[i][mid], bst = i;
	}
	dp[mid][k] = mx;
	solve(st, mid - 1, l, bst, k);
	solve(mid + 1, en, bst, r, k);
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin>>n>>m;

	for (int i=1;i<=n;i++){
		cin>>s[i];
		s[i] = '0' + s[i];
	}

	for (int i=1;i<=n;i++){
		for (int j=1;j<=m;j++){
			if (seen[i][j] == 0){
				Mn = Mx = j, Sm = 0;
				bfs(i, j);
				if (Sm == 0)
					continue;
				Cst[Mn][1] += Sm;
				Cst[Mn][Mx + 1] -= Sm;
			}
		}
	}

	for (int k : {0, 1}){
		for (int i=1;i<N;i++)
			for (int j=1;j<N;j++)
				Cst[i][j] += Cst[i][j-1] * (1 - k) + Cst[i-1][j] * k;
	}
	for (int i=1;i<N;i++)
		dp[i][1] = Cst[i][i];

	for (int k=2;k<=m;k++)
		solve(1, m, 1, m, k);

	for (int i=1;i<=m;i++){
		for (int j=1;j<=m;j++)
			dp[m][i] = max(dp[m][i], dp[j][i]);
		cout<<dp[m][i]<<'\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...