Submission #954144

#TimeUsernameProblemLanguageResultExecution timeMemory
954144gaga999Sandcastle 2 (JOI22_ho_t5)C++17
100 / 100
414 ms21332 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); } #define vi vector<int> #define vvi vector<vi> vvi 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) { if (c1 && gv(x - 1, y, pp) == 4) return 0; if (c2 && gv(x, y - 1, pp) == 3) return 0; if (c3 && gv(x, y + 1, pp) == 2) return 0; if (c4 && gv(x + 1, y, pp) == 1) return 0; return 1; } #define vt(i, j) vvi(i, vector<int>(j)) int cnt[50004]; 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++) { vector<vector<int>> &vv = v[l][r][u][d] = vt(n, m); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) vv[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); vvi &vvv = v[l][r][2][2], &v11 = v1[l][r], &v22 = v2[l][r]; for (int i = 0; i < n; i++) { v11[i][0] = vvv[i][0]; for (int j = 1; j < m; j++) v11[i][j] = vvv[i][j] + v11[i][j - 1]; } vvv = v[2][2][l][r]; for (int j = 0; j < m; j++) { v22[0][j] = vvv[0][j]; for (int i = 1; i < n; i++) v22[i][j] = vvv[i][j] + v22[i - 1][j]; } } } vr = vt(n, m); { vvi &v2v = v[2][2][2][2]; vi &vvv = v2v[0]; for (int i = 0; i < m; i++) vr[0][i] = vvv[i]; for (int i = 1; i < n; i++) { vr[i][0] = vvv[i]; for (int j = 1; j < m; j++) { vr[i][j] = vr[i - 1][j] + vr[i][j - 1] - vr[i - 1][j - 1] + v2v[i][j]; } } } llt ans = 0; for (int l = 0; l < n; l++) { for (int r = l; r < n; r++) { if (r - l < 4) { for (int i = 3; i < m; i++) { int tp = 1; for (int a = l; a <= r; a++) { int x = min(2, a - l), y = min(2, r - a); tp += v1[x][y][a][i - 2] - v[x][y][0][2][a][i - 3] - v[x][y][1][2][a][i - 2]; } if (tp >= 0) cnt[tp]++; tp = 0; for (int a = l; a <= r; a++) { int x = min(2, a - l), y = min(2, r - a); tp += v1[x][y][a][i - 2] + v[x][y][2][1][a][i - 1] + v[x][y][2][0][a][i]; } ans += cnt[tp]; } for (int i = 0; i < m; i++) { for (int j = i; j < min(i + 3, m); j++) { 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 { for (int i = 0; i < m; i++) { for (int j = i; j < min(i + 3, m); j++) { 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[1][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++; } } for (int i = 3; i < m; i++) { int tp = 1; tp += v1[0][2][l][i - 2] - v[0][2][0][2][l][i - 3] - v[0][2][1][2][l][i - 2]; tp += v1[1][2][l + 1][i - 2] - v[1][2][0][2][l + 1][i - 3] - v[1][2][1][2][l + 1][i - 2]; tp += v1[2][0][r][i - 2] - v[2][0][0][2][r][i - 3] - v[2][0][1][2][r][i - 2]; tp += v1[2][1][r - 1][i - 2] - v[2][1][0][2][r - 1][i - 3] - v[2][1][1][2][r - 1][i - 2]; tp += vr[r - 2][i - 2] - vr[l + 1][i - 2] - v2[0][2][r - 2][i - 3] + v2[0][2][l + 1][i - 3] - v2[1][2][r - 2][i - 2] + v2[1][2][l + 1][i - 2]; if (tp >= 0) cnt[tp]++; tp = 0; tp += v1[0][2][l][i - 2] + v[0][2][2][0][l][i] + v[0][2][2][1][l][i - 1]; tp += v1[1][2][l + 1][i - 2] + v[1][2][2][0][l + 1][i] + v[1][2][2][1][l + 1][i - 1]; tp += v1[2][0][r][i - 2] + v[2][0][2][0][r][i] + v[2][0][2][1][r][i - 1]; tp += v1[2][1][r - 1][i - 2] + v[2][1][2][0][r - 1][i] + v[2][1][2][1][r - 1][i - 1]; tp += vr[r - 2][i - 2] - vr[l + 1][i - 2] + v2[2][0][r - 2][i] - v2[2][0][l + 1][i] + v2[2][1][r - 2][i - 1] - v2[2][1][l + 1][i - 1]; ans += cnt[tp]; } } memset(cnt, 0, ((r - l + 1) * m) << 2); } } 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...