#include <iostream>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
#define NONE 0xffffffff
unsigned int slice[60][1286][128] = {{{}}};
unsigned int m, n, l, t;
inline unsigned int root(unsigned int i, unsigned int j, unsigned int k) {
unsigned int id = slice[i][j][k];
unsigned int ii = id >> 24;
unsigned int jj = (id & 0x00ffff00) >> 8;
unsigned int kk = id & 0xff;
if((ii^i) | (jj^j) | (kk^k)) {
return root(ii, jj, kk);
}
else
return id;
}
inline void merge(unsigned int i1, unsigned int j1, unsigned int k1,
unsigned int i2, unsigned int j2, unsigned int k2) {
unsigned int r1 = root(i1, j1, k1);
unsigned int r2 = root(i2, j2, k2);
if(r1 != r2) {
if(r1 > r2)
swap(r1, r2);
slice[r2 >> 24][(r2 & 0xffff00) >> 8][r2 & 0xff] = r1;
}
}
int main(int argc, char **argv) {
cin >> m >> n >> l >> t;
for(unsigned int i = 0; i < l; i ++) {
for(unsigned int j = 0; j < m; j ++) {
for(unsigned int k = 0; k < n; k ++) {
int d;
scanf("%d", &d);
if(d) {
slice[i][j][k] = ((i << 24) | (j << 8) | k);
if(i > 0 && slice[i-1][j][k] != NONE ) {
merge(i, j, k, i-1, j, k);
}
if(j > 0 && slice[i][j-1][k] != NONE) {
merge(i, j, k, i, j-1, k);
}
if(k > 0 && slice[i][j][k-1] != NONE) {
merge(i, j, k, i, j, k-1);
}
}
else
slice[i][j][k] = NONE;
}
}
}
map<int, int> cc;
for(unsigned int i = 0; i < l; i ++) {
for(unsigned int j = 0; j < m; j ++) {
for(unsigned int k = 0; k < n; k ++) {
if(slice[i][j][k] != NONE) {
int r = root(i, j, k);
cc[r] ++;
}
}
}
}
int count = 0;
for(map<int, int>::iterator it = cc.begin(); it != cc.end(); it ++) {
int tmpc = it->second;
if(tmpc >= t)
count += tmpc;
}
printf("%d\n", count);
return 0;
}
1091. Acute Stroke (30)
最新推荐文章于 2019-02-07 09:01:35 发布