이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "rect.h"
#include <algorithm>
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 2500 * 2500;
int id[MAXN];
int sz[MAXN];
int minLig[MAXN], maxLig[MAXN], minCol[MAXN], maxCol[MAXN];
bool activated[2500][2500];
int DX[] = {-1, 1, 0, 0};
int DY[] = {0, 0, -1, 1};
int nbLig, nbCol;
set<tuple<int, int, int, int>> rectangles, curRectangles;
int find(int i) {
if (id[i] == i)
return i;
return id[i] = find(id[i]);
}
bool estRectangle(int cc) {
assert(id[cc] == cc);
return minLig[cc] > 0 and maxLig[cc] < nbLig - 1 and minCol[cc] > 0 and
maxCol[cc] < nbCol - 1 and
sz[cc] ==
(1 + maxCol[cc] - minCol[cc]) * (maxLig[cc] - minLig[cc] + 1);
}
void merge(int a, int b) {
a = find(a);
b = find(b);
if (a == b)
return;
if (sz[a] < sz[b])
swap(a, b);
if (estRectangle(a)) {
curRectangles.erase({minLig[a], maxLig[a], minCol[a], maxCol[a]});
}
if (estRectangle(b)) {
curRectangles.erase({minLig[b], maxLig[b], minCol[b], maxCol[b]});
}
id[b] = a;
sz[a] += sz[b];
minLig[a] = min(minLig[a], minLig[b]);
maxLig[a] = max(maxLig[a], maxLig[b]);
minCol[a] = min(minCol[a], minCol[b]);
maxCol[a] = max(maxCol[a], maxCol[b]);
if (estRectangle(a)) {
curRectangles.insert({minLig[a], maxLig[a], minCol[a], maxCol[a]});
}
}
int hashCoord(int iLig, int iCol) { return iLig * nbCol + iCol; }
void active(int iLig, int iCol) {
int hsh = hashCoord(iLig, iCol);
id[hsh] = hsh;
sz[hsh] = 1;
minLig[hsh] = maxLig[hsh] = iLig;
minCol[hsh] = maxCol[hsh] = iCol;
if (estRectangle(hsh))
curRectangles.insert({iLig, iLig, iCol, iCol});
}
int count_rectangles(vector<vector<signed>> a) {
vector<int> vals;
nbLig = a.size(), nbCol = a[0].size();
for (int iLig = 0; iLig < nbLig; ++iLig)
for (int iCol = 0; iCol < nbCol; ++iCol)
vals.push_back(a[iLig][iCol]);
sort(vals.begin(), vals.end());
vals.resize(unique(vals.begin(), vals.end()) - vals.begin());
for (int iLig = 0; iLig < nbLig; ++iLig)
for (int iCol = 0; iCol < nbCol; ++iCol)
a[iLig][iCol] =
lower_bound(vals.begin(), vals.end(), a[iLig][iCol]) - vals.begin();
for (int iLig = 0; iLig < nbLig; ++iLig)
for (int iCol = 0; iCol < nbCol; ++iCol)
cout << a[iLig][iCol] << " \n"[iCol == nbCol - 1];
int nbVal = vals.size();
vector<vector<pair<int, int>>> withVal(nbVal);
for (int iLig = 0; iLig < nbLig; ++iLig)
for (int iCol = 0; iCol < nbCol; ++iCol)
withVal[a[iLig][iCol]].emplace_back(iLig, iCol);
for (int val = 0; val < nbVal; ++val) {
for (auto [iLig, iCol] : withVal[val]) {
active(iLig, iCol);
activated[iLig][iCol] = true;
}
for (auto [iLig, iCol] : withVal[val]) {
for (int d = 0; d < 4; ++d) {
int lig = iLig + DX[d];
int col = iCol + DY[d];
if (lig < 0 or col < 0 or lig >= nbLig or col >= nbCol or
!activated[lig][col])
continue;
merge(hashCoord(iLig, iCol), hashCoord(lig, col));
}
}
// cout << val << ' ' << curRectangles.size() << endl;
for (auto v : curRectangles)
rectangles.insert(v);
}
return rectangles.size();
;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |