Submission #907001

#TimeUsernameProblemLanguageResultExecution timeMemory
907001gaga999Sandcastle 2 (JOI22_ho_t5)C++17
0 / 100
5031 ms20276 KiB
#include <cstdio> #include <stdio.h> #include <iostream> #include <math.h> #include <vector> #include <queue> #include <stack> #include <deque> #include <algorithm> #include <utility> #include <set> #include <map> #include <stdlib.h> #include <cstring> #include <string.h> #include <string> #include <sstream> #include <assert.h> #include <climits> #include <sstream> #include <numeric> #include <time.h> #include <limits.h> #include <list> #include <bitset> #include <unordered_map> #include <unordered_set> #include <random> #include <iomanip> #include <complex> #include <chrono> #include <fstream> #include <functional> #include <unistd.h> // #pragma GCC optimize("Ofast,no-stack-protector") // #pragma GCC optimize("O3,unroll-loops") // #pragma GCC target("avx,avx2,bmi,bmi2,lzcnt,popcnt") #define lowbit(x) ((x) & -(x)) #define ml(a, b) ((1ll * (a) * (b)) % M) #define tml(a, b) (a) = ((1ll * (a) * (b)) % M) #define ad(a, b) ((0ll + (a) + (b)) % M) #define tad(a, b) (a) = ((0ll + (a) + (b)) % M) #define mi(a, b) ((0ll + M + (a) - (b)) % M) #define tmi(a, b) (a) = ((0ll + M + (a) - (b)) % M) #define tmin(a, b) (a) = min((a), (b)) #define tmax(a, b) (a) = max((a), (b)) #define iter(a) (a).begin(), (a).end() #define riter(a) (a).rbegin(), (a).rend() #define init(a, b) memset((a), (b), sizeof(a)) #define cpy(a, b) memcpy((a), (b), sizeof(a)) #define uni(a) a.resize(unique(iter(a)) - a.begin()) #define pb emplace_back #define mpr make_pair #define ls(i) ((i) << 1) #define rs(i) ((i) << 1 | 1) #define INF 0x3f3f3f3f #define NIF 0xc0c0c0c0 #define eps 1e-9 #define F first #define S second #define AC cin.tie(0)->sync_with_stdio(0) using namespace std; typedef long long llt; typedef pair<int, int> pii; typedef pair<double, double> pdd; typedef pair<llt, llt> pll; typedef complex<double> cd; // const int M = 998244353; // random_device rm; // mt19937 rg(rm()); // default_random_engine rg(rm()); // uniform_int_distribution<int> rd(INT_MIN, INT_MAX); // uniform_real_distribution<double> rd(0, M_PI); void db() { cerr << "\n"; } template <class T, class... U> void db(T a, U... b) { cerr << a << " ", db(b...); } inline char gc() { const static int SZ = 1 << 16; static char buf[SZ], *p1, *p2; if (p1 == p2 && (p2 = buf + fread(p1 = buf, 1, SZ, stdin), p1 == p2)) return -1; return *p1++; } void rd() {} template <typename T, typename... U> void rd(T &x, U &...y) { x = 0; bool f = 0; char c = gc(); while (!isdigit(c)) f ^= !(c ^ 45), c = gc(); while (isdigit(c)) x = (x << 1) + (x << 3) + (c ^ 48), c = gc(); f && (x = -x), rd(y...); } template <typename T> void prt(T x) { if (x < 0) putchar('-'), x = -x; if (x > 9) prt(x / 10); putchar((x % 10) ^ 48); } vector<vector<int>> gd, v[3][3][3][3], v1[3][3], v2[3][3], vr; #define p1 [x - 1][y] #define p2 [x][y - 1] #define p3 [x][y + 1] #define p4 [x + 1][y] #define c1 x != l #define c2 y != u #define c3 y != d #define c4 x != r int gv(int x, int y, int l, int r, int u, int d) { int mn = INF, cr = gd[x][y], res = 0; if (c1 && gd p1 > cr && gd p1 < mn) mn = gd p1, res = 1; if (c2 && gd p2 > cr && gd p2 < mn) mn = gd p2, res = 2; if (c3 && gd p3 > cr && gd p3 < mn) mn = gd p3, res = 3; if (c4 && gd p4 > cr && gd p4 < mn) mn = gd p4, res = 4; return res; } #define pp l, r, u, d int slv(int x, int y, int l, int r, int u, int d) { int res = 0; if (c1 && gv(x - 1, y, pp) == 4) res++; if (c2 && gv(x, y - 1, pp) == 3) res++; if (c3 && gv(x, y + 1, pp) == 2) res++; if (c4 && gv(x + 1, y, pp) == 1) res++; return !res; } inline int grc(int l, int r, int i, int j) { return vr[l][r] + vr[i][j] - vr[l][j] - vr[r][i]; } #define vt(i, j) vector<vector<int>>(i, vector<int>(j)) signed main() { int n, m; rd(n, m); if (n > m) { swap(n, m); gd = vt(n, m); for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) rd(gd[j][i]); } else { gd = vt(n, m); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) rd(gd[i][j]); } for (int l = 0; l < 3; l++) { for (int r = 0; r < 3; r++) { for (int u = 0; u < 3; u++) { for (int d = 0; d < 3; d++) { v[l][r][u][d] = vt(n, m); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) v[l][r][u][d][i][j] = slv(i, j, max(0, i - l), min(n - 1, i + r), max(0, j - u), min(m - 1, j + d)); } } } } for (int l = 0; l < 3; l++) { for (int r = 0; r < 3; r++) { v1[l][r] = v2[l][r] = vt(n, m); for (int i = 0; i < n; i++) { v1[l][r][i][0] = v[l][r][2][2][i][0]; for (int j = 1; j < m; j++) v1[l][r][i][j] = v[l][r][2][2][i][j] + v1[l][r][i][j - 1]; } for (int j = 0; j < m; j++) { v2[l][r][0][j] = v[2][2][l][r][0][j]; for (int i = 1; i < n; i++) v2[l][r][i][j] = v[2][2][l][r][i][j] + v2[l][r][i - 1][j]; } } } vr = vt(n, m); for (int i = 0; i < m; i++) vr[0][i] = v[2][2][2][2][0][i]; for (int i = 1; i < n; i++) { vr[i][0] = v[2][2][2][2][0][i]; for (int j = 1; j < m; j++) { vr[i][j] = vr[i - 1][j] + vr[i][j - 1] - vr[i - 1][j - 1] + v[2][2][2][2][i][j]; } } llt ans = 0; for (int l = 0; l < n; l++) { for (int r = 0; r < n; r++) { if (r - l < 4) { for (int i = 0; i < m; i++) { for (int j = i; j < m; j++) { if (j - i < 4) { int tp = 0; for (int a = l; a <= r; a++) for (int b = i; b <= j; b++) tp += v[min(2, a - l)][min(2, r - a)][min(2, b - i)][min(2, j - b)][a][b]; if (tp == 1) ans++; } else { int tp = 0; for (int a = l; a <= r; a++) { int x = min(2, a - l), y = min(2, r - a); tp += v[x][y][0][2][a][i]; tp += v[x][y][1][2][a][i + 1]; tp += v[x][y][2][0][a][j]; tp += v[x][y][2][1][a][j - 1]; tp += v1[x][y][a][j - 2] - v1[x][y][a][i + 1]; } if (tp == 1) ans++; } } } } else { for (int i = 0; i < m; i++) { for (int j = i; j < m; j++) { if (j - i < 4) { int tp = 0; for (int b = i; b <= j; b++) { int x = min(b - i, 2), y = min(j - b, 2); tp += v[0][2][x][y][l][b]; tp += v[0][2][x][y][l + 1][b]; tp += v[2][0][x][y][r][b]; tp += v[2][1][x][y][r - 1][b]; tp += v2[x][y][r - 2][b] - v2[x][y][l + 1][b]; } if (tp == 1) ans++; } else { int tp = 0; tp += v[0][2][0][2][l][i]; tp += v[1][2][0][2][l + 1][i]; tp += v[0][2][1][2][l][i + 1]; tp += v[1][2][1][2][l + 1][i + 1]; //-0------------- tp += v[2][0][2][0][r][j]; tp += v[2][1][2][0][r - 1][j]; tp += v[2][0][2][1][r][j - 1]; tp += v[2][1][2][1][r - 1][j - 1]; //-0------------- tp += v[2][0][0][2][r][i]; tp += v[2][0][1][2][r][i + 1]; tp += v[2][1][0][2][r - 1][i]; tp += v[2][1][1][2][r - 1][i + 1]; //----------------- tp += v[0][2][2][0][l][j]; tp += v[1][2][2][0][l + 1][j]; tp += v[0][2][2][1][l][j - 1]; tp += v[1][2][2][1][l + 1][j - 1]; //--------------------- tp += v2[0][2][r - 2][i] - v2[0][2][l + 1][i]; tp += v2[1][2][r - 2][i + 1] - v2[1][2][l + 1][i + 1]; tp += v2[2][0][r - 2][j] - v2[2][0][l + 1][j]; tp += v2[2][1][r - 2][j - 1] - v2[2][1][l + 1][j - 1]; //--------------- tp += v1[0][2][l][j - 2] - v1[0][2][l][i + 1]; tp += v1[1][2][l + 1][j - 2] - v1[1][2][l + 1][i + 1]; tp += v1[2][0][r][j - 2] - v1[2][0][r][i + 1]; tp += v1[2][1][r - 1][j - 2] - v1[2][1][r - 1][i + 1]; //-------------- tp += grc(l + 1, r - 2, i + 1, j - 2); if (tp == 1) ans++; } } } } } } prt(ans), putchar('\n'); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...