#include <bits/stdc++.h>
using namespace std;
const int N = 15013;
const int SQ = 240;
int a[200013];
int b[200013];
bool f[200013];
int s[200013];
int h, w;
int id(int i, int j){
return i * (w + 1) + j;
}
int id2(int i, int j){
return j * (h + 1) + i;
}
struct Range{
short x1, x2, y1, y2; // 1D; [x1, x2] x [y1, y2]
};
vector<Range> vrs[SQ][SQ];
int qry(int x1, int x2, int y1, int y2){
return s[id(x2 + 1, y2 + 1)] + s[id(x1, y1)] - s[id(x2 + 1, y1)] - s[id(x1, y2 + 1)];
}
struct BIT{
short bit[N][N] = {0};
void clear(int n){
n += 10;
for(int i = 0; i <= n; i++){
for(int j = 0; j <= n; j++){
bit[i][j] = 0;
}
}
}
void upd(int x, int y, int v){
x += 2; y += 2;
for(int i = x; i < w + 10; i += i & -i){
for(int j = y; j < w + 10; j += j & -j){
bit[i][j] += v;
}
}
}
void upd(int x1, int x2, int y1, int y2, int v){
upd(x2 + 1, y2 + 1, v);
upd(x1, y2 + 1, -v);
upd(x2 + 1, y1, -v);
upd(x1, y1, v);
}
int qry(int x, int y){
x += 2; y += 2;
int ret = 0;
for(int i = x; i; i -= i & -i){
for(int j = y; j; j -= j & -j){
ret += bit[i][j];
}
}
return ret;
}
int qry(int x1, int x2, int y1, int y2){
return qry(x2, y2) - qry(x2, y1 - 1) - qry(x1 - 1, y2) + qry(x1 - 1, y1 - 1);
}
} bit;
int g(vector<Range> vr, int h){
bit.clear(w);
for(auto r : vr){
bit.upd(r.x1, r.x2, r.y1, r.y2, 1);
}
int ans = 0;
for(int i = 0; i < w; i++){
for(int j = i; j < w; j++){
ans += bit.qry(i, j) == h * (j - i + 1) - 1;
}
}
return ans;
}
int32_t main(){
cin >> h >> w;
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
cin >> a[id(i, j)];
}
}
if(h > w){
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
b[id2(i, j)] = a[id(i, j)];
}
}
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
a[id2(i, j)] = b[id2(i, j)];
}
}
swap(w, h);
}
{
set<int> S; map<int, int> M;
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
S.insert(a[id(i, j)]);
}
}
int idx = 0;
for(auto j : S){
M[j] = idx++;
}
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
a[id(i, j)] = M[a[id(i, j)]];
}
}
}
int ans = 0;
for(int i = 0; i < h; i++){
for(int j = 0; j < w - 1; j++){
int v1 = a[id(i, j)], v2 = a[id(i, j + 1)];
if(v1 > v2) swap(v1, v2);
for(int x = 0; x < h; x++){
for(int y = 0; y < w; y++){
f[id(x, y)] = a[id(x, y)] > v1 && a[id(x, y)] < v2;
}
}
for(int x = 0; x < h; x++){
for(int y = 0; y < w; y++){
s[id(x + 1, y + 1)] = s[id(x + 1, y)] + s[id(x, y + 1)] - s[id(x, y)] + f[id(x, y)];
}
}
int x1 = i, x2 = i, y1 = j, y2 = j + 1;
for(int x3 = 0; x3 <= x1; x3++){
for(int x4 = x2; x4 < h; x4++){
if(qry(x3, x4, y1, y2)) continue;
int y3 = INT16_MAX, y4 = INT16_MIN;
{
int l = 0, r = y1;
while(l != r){
int mid = (l + r) / 2;
if(qry(x3, x4, mid, y1)){
l = mid + 1;
}else{
r = mid;
}
}
y3 = l;
}
{
int l = y2, r = w - 1;
while(l != r){
int mid = (l + r + 1) / 2;
if(qry(x3, x4, y2, mid)){
r = mid - 1;
}else{
l = mid;
}
}
y4 = l;
}
vrs[x3][x4].push_back({y3, y1, y2, y4});
}
}
}
}
for(int i = 0; i < h - 1; i++){
for(int j = 0; j < w; j++){
int v1 = a[id(i, j)], v2 = a[id(i + 1, j)];
if(v1 > v2) swap(v1, v2);
for(int x = 0; x < h; x++){
for(int y = 0; y < w; y++){
f[id(x, y)] = a[id(x, y)] > v1 && a[id(x, y)] < v2;
}
}
for(int x = 0; x < h; x++){
for(int y = 0; y < w; y++){
s[id(x + 1, y + 1)] = s[id(x + 1, y)] + s[id(x, y + 1)] - s[id(x, y)] + f[id(x, y)];
}
}
int x1 = i, x2 = i + 1, y1 = j, y2 = j;
for(int x3 = 0; x3 <= x1; x3++){
for(int x4 = x2; x4 < h; x4++){
if(qry(x3, x4, y1, y2)) continue;
int y3 = INT16_MAX, y4 = INT16_MIN;
{
int l = 0, r = y1;
while(l != r){
int mid = (l + r) / 2;
if(qry(x3, x4, mid, y1)){
l = mid + 1;
}else{
r = mid;
}
}
y3 = l;
}
{
int l = y2, r = w - 1;
while(l != r){
int mid = (l + r + 1) / 2;
if(qry(x3, x4, y2, mid)){
r = mid - 1;
}else{
l = mid;
}
}
y4 = l;
}
vrs[x3][x4].push_back({y3, y1, y2, y4});
}
}
}
}
for(int x1 = 0; x1 < h; x1++){
for(int x2 = x1; x2 < h; x2++){
ans += g(vrs[x1][x2], x2 - x1 + 1);
}
}
cout << ans << endl;
}
Compilation message
Main.cpp: In function 'int32_t main()':
Main.cpp:163:29: warning: narrowing conversion of 'y3' from 'int' to 'short int' [-Wnarrowing]
163 | vrs[x3][x4].push_back({y3, y1, y2, y4});
| ^~
Main.cpp:163:33: warning: narrowing conversion of 'y1' from 'int' to 'short int' [-Wnarrowing]
163 | vrs[x3][x4].push_back({y3, y1, y2, y4});
| ^~
Main.cpp:163:37: warning: narrowing conversion of 'y2' from 'int' to 'short int' [-Wnarrowing]
163 | vrs[x3][x4].push_back({y3, y1, y2, y4});
| ^~
Main.cpp:163:41: warning: narrowing conversion of 'y4' from 'int' to 'short int' [-Wnarrowing]
163 | vrs[x3][x4].push_back({y3, y1, y2, y4});
| ^~
Main.cpp:212:29: warning: narrowing conversion of 'y3' from 'int' to 'short int' [-Wnarrowing]
212 | vrs[x3][x4].push_back({y3, y1, y2, y4});
| ^~
Main.cpp:212:33: warning: narrowing conversion of 'y1' from 'int' to 'short int' [-Wnarrowing]
212 | vrs[x3][x4].push_back({y3, y1, y2, y4});
| ^~
Main.cpp:212:37: warning: narrowing conversion of 'y2' from 'int' to 'short int' [-Wnarrowing]
212 | vrs[x3][x4].push_back({y3, y1, y2, y4});
| ^~
Main.cpp:212:41: warning: narrowing conversion of 'y4' from 'int' to 'short int' [-Wnarrowing]
212 | vrs[x3][x4].push_back({y3, y1, y2, y4});
| ^~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1620 KB |
Output is correct |
2 |
Execution timed out |
5081 ms |
488620 KB |
Time limit exceeded |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1748 KB |
Output is correct |
2 |
Correct |
1 ms |
1748 KB |
Output is correct |
3 |
Correct |
1 ms |
1748 KB |
Output is correct |
4 |
Correct |
1 ms |
1748 KB |
Output is correct |
5 |
Correct |
1 ms |
1748 KB |
Output is correct |
6 |
Correct |
2 ms |
1748 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1748 KB |
Output is correct |
2 |
Correct |
1 ms |
1748 KB |
Output is correct |
3 |
Correct |
1 ms |
1748 KB |
Output is correct |
4 |
Correct |
1 ms |
1748 KB |
Output is correct |
5 |
Correct |
1 ms |
1748 KB |
Output is correct |
6 |
Correct |
2 ms |
1748 KB |
Output is correct |
7 |
Correct |
51 ms |
12428 KB |
Output is correct |
8 |
Correct |
50 ms |
12424 KB |
Output is correct |
9 |
Correct |
31 ms |
2660 KB |
Output is correct |
10 |
Correct |
68 ms |
7292 KB |
Output is correct |
11 |
Correct |
37 ms |
6056 KB |
Output is correct |
12 |
Correct |
36 ms |
6068 KB |
Output is correct |
13 |
Correct |
60 ms |
7180 KB |
Output is correct |
14 |
Correct |
35 ms |
4516 KB |
Output is correct |
15 |
Correct |
48 ms |
5196 KB |
Output is correct |
16 |
Correct |
34 ms |
3396 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1748 KB |
Output is correct |
2 |
Correct |
1 ms |
1748 KB |
Output is correct |
3 |
Correct |
1 ms |
1748 KB |
Output is correct |
4 |
Correct |
1 ms |
1748 KB |
Output is correct |
5 |
Correct |
1 ms |
1748 KB |
Output is correct |
6 |
Correct |
2 ms |
1748 KB |
Output is correct |
7 |
Correct |
51 ms |
12428 KB |
Output is correct |
8 |
Correct |
50 ms |
12424 KB |
Output is correct |
9 |
Correct |
31 ms |
2660 KB |
Output is correct |
10 |
Correct |
68 ms |
7292 KB |
Output is correct |
11 |
Correct |
37 ms |
6056 KB |
Output is correct |
12 |
Correct |
36 ms |
6068 KB |
Output is correct |
13 |
Correct |
60 ms |
7180 KB |
Output is correct |
14 |
Correct |
35 ms |
4516 KB |
Output is correct |
15 |
Correct |
48 ms |
5196 KB |
Output is correct |
16 |
Correct |
34 ms |
3396 KB |
Output is correct |
17 |
Correct |
1450 ms |
126884 KB |
Output is correct |
18 |
Correct |
575 ms |
8180 KB |
Output is correct |
19 |
Correct |
578 ms |
6088 KB |
Output is correct |
20 |
Correct |
2457 ms |
151620 KB |
Output is correct |
21 |
Correct |
1505 ms |
82224 KB |
Output is correct |
22 |
Correct |
1779 ms |
104780 KB |
Output is correct |
23 |
Correct |
1565 ms |
100172 KB |
Output is correct |
24 |
Correct |
1057 ms |
57488 KB |
Output is correct |
25 |
Correct |
1475 ms |
75644 KB |
Output is correct |
26 |
Correct |
1503 ms |
83540 KB |
Output is correct |
27 |
Correct |
700 ms |
22364 KB |
Output is correct |
28 |
Correct |
778 ms |
25240 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
1748 KB |
Output is correct |
2 |
Correct |
1 ms |
1748 KB |
Output is correct |
3 |
Correct |
1 ms |
1748 KB |
Output is correct |
4 |
Correct |
1 ms |
1748 KB |
Output is correct |
5 |
Correct |
1 ms |
1748 KB |
Output is correct |
6 |
Correct |
2 ms |
1748 KB |
Output is correct |
7 |
Correct |
51 ms |
12428 KB |
Output is correct |
8 |
Correct |
50 ms |
12424 KB |
Output is correct |
9 |
Correct |
31 ms |
2660 KB |
Output is correct |
10 |
Correct |
68 ms |
7292 KB |
Output is correct |
11 |
Correct |
37 ms |
6056 KB |
Output is correct |
12 |
Correct |
36 ms |
6068 KB |
Output is correct |
13 |
Correct |
60 ms |
7180 KB |
Output is correct |
14 |
Correct |
35 ms |
4516 KB |
Output is correct |
15 |
Correct |
48 ms |
5196 KB |
Output is correct |
16 |
Correct |
34 ms |
3396 KB |
Output is correct |
17 |
Correct |
1450 ms |
126884 KB |
Output is correct |
18 |
Correct |
575 ms |
8180 KB |
Output is correct |
19 |
Correct |
578 ms |
6088 KB |
Output is correct |
20 |
Correct |
2457 ms |
151620 KB |
Output is correct |
21 |
Correct |
1505 ms |
82224 KB |
Output is correct |
22 |
Correct |
1779 ms |
104780 KB |
Output is correct |
23 |
Correct |
1565 ms |
100172 KB |
Output is correct |
24 |
Correct |
1057 ms |
57488 KB |
Output is correct |
25 |
Correct |
1475 ms |
75644 KB |
Output is correct |
26 |
Correct |
1503 ms |
83540 KB |
Output is correct |
27 |
Correct |
700 ms |
22364 KB |
Output is correct |
28 |
Correct |
778 ms |
25240 KB |
Output is correct |
29 |
Execution timed out |
5059 ms |
376336 KB |
Time limit exceeded |
30 |
Halted |
0 ms |
0 KB |
- |