Submission #785856

#TimeUsernameProblemLanguageResultExecution timeMemory
785856flappybirdRaspad (COI17_raspad)C++17
100 / 100
320 ms210008 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx,avx2,fma")
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
#define MAX 103030
#define MAXS 22
#define INF 1000000000000000001
#define bb ' '
#define ln '\n'
#define Ln '\n'
int N, M;
int mp[MAX][60];
ll ans;
int vis[MAX][60];
int ccnt;
int dx[8] = { 1, 1, 1, 0, 0, -1, -1, -1 };
int dy[8] = { 1, 0, -1, 1, -1, 1, 0, -1 };
pii range[MAX * 60];
bool chk(int x, int y) {
	return 0 <= x && x <= N + 1 && 0 <= y && y <= M + 1;
}
void dfs(int x, int y, int c) {
	if (!chk(x, y)) return;
	if (mp[x][y]) return;
	if (vis[x][y]) return;
	vis[x][y] = c;
	int k;
	for (k = 0; k < 8; k++) dfs(x + dx[k], y + dy[k], c);
}
signed main() {
	ios::sync_with_stdio(false), cin.tie(0);
	cin >> N >> M;
	int i, j;
	string s;
	for (i = 1; i <= N; i++) {
		cin >> s;
		for (j = 1; j <= M; j++) mp[i][j] = s[j - 1] == '1';
	}
	int cnt = 0;
	ll v, e, f;
	v = e = f = 0;
	for (i = 1; i <= N; i++) {
		cnt = 0;
		for (j = 1; j <= M; j++) cnt += mp[i][j];
		v += 1ll * cnt * i * (N + 1 - i);
	}
	for (i = 1; i <= N; i++) {
		cnt = 0;
		for (j = 1; j < M; j++) cnt += mp[i][j] & mp[i][j + 1];
		e += 1ll * cnt * i * (N + 1 - i);
	}
	for (i = 2; i <= N; i++) {
		cnt = 0;
		for (j = 1; j <= M; j++) cnt += mp[i][j] & mp[i - 1][j];
		e += 1ll * cnt * (i - 1) * (N + 1 - i);
	}
	dfs(0, 0, -1);
	for (i = 1; i <= N; i++) for (j = 1; j <= M; j++) if (!mp[i][j] && !vis[i][j]) dfs(i, j, ++ccnt);
	for (i = 1; i <= ccnt; i++) range[i] = pii(N + 100, -1000);
	for (i = 1; i <= N; i++) for (j = 1; j <= M; j++) {
		if (vis[i][j]) {
			int c = vis[i][j];
			range[c].first = min(range[c].first, i);
			range[c].second = max(range[c].second, i);
		}
	}
	for (i = 1; i <= ccnt; i++) f += 1ll * (range[i].first - 1) * (N - range[i].second);
	for (i = 2; i <= N; i++) for (j = 2; j <= M; j++) if (mp[i][j] && mp[i - 1][j] && mp[i][j - 1] && mp[i - 1][j - 1]) f += 1ll * (i - 1) * (N + 1 - i);
	cout << v - e + f << ln;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...