Pagini recente » Cod sursa (job #1076203) | Cod sursa (job #712264) | Cod sursa (job #2584597) | Cod sursa (job #1004562) | Cod sursa (job #1624409)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
void read(char *&p, int &val)
{
val = 0;
bool sign = false;
while (*p == ' ' || *p == '\n')
{
p++;
}
while (*p >= '0' && *p <= '9')
{
val = val * 10 + (*p - '0');
p++;
}
}
int main()
{
char *s = new char[10 * 1024 * 1024];
int N, i, j, x;
vector<int> count; //count[i] = nr matrici ixi
vector<vector<bool>> M;
vector<vector<int>> left, up, sol;
ifstream f("custi.in");
f.read(s, 10 * 1024 * 1024);
size_t bytesRead = f.gcount();
char *p = s;
read(p, N);
//f >> N;
M.resize(N + 1);
count.resize(N + 1, 0);
sol.resize(N + 1);
left.resize(N + 1);
up.resize(N + 1);
M[0].resize(N + 1);
up[0].resize(N + 1);
left[0].resize(N + 1);
sol[0].resize(N + 1, 0);
for (i = 1; i <= N; i++)
{
M[i].resize(N + 1);
left[i].resize(N + 1, 0);
up[i].resize(N + 1, 0);
sol[i].resize(N + 1, 0);
for (j = 1; j <= N; j++)
{
read(p, x);
M[i][j] = (x == 1 ? true : false);
left[i][j] = (M[i][j - 1] ? left[i][j - 1] + 1 : 0);
up[i][j] = (M[i - 1][j] ? up[i - 1][j] + 1 : 0);
if (M[i][j])
{
sol[i][j] = min(left[i][j], min(up[i][j], sol[i - 1][j - 1])) + 1;
int k = sol[i][j];
while (k > 0)
{
count[k--]++;
}
}
}
}
f.close();
ofstream g("custi.out");
for (i = 1; i <= N; i++)
{
g << count[i] << "\n";
}
g.close();
return 0;
}