Submission #1007929

# Submission time Handle Problem Language Result Execution time Memory
1007929 2024-06-25T22:38:16 Z PagodePaiva Rectangles (IOI19_rect) C++17
23 / 100
4322 ms 1007508 KB
#include "rect.h"
#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 2510;
const int inf = 1e8;
int v[N][N];
int p1[N][N];
int p2[N][N];
int p3[N][N];
int p4[N][N];

struct Segtree{
	int tree[4*N];
	int join(int a, int b){
		return min(a, b);
	}
	void build(int node, int l, int r){
		if(l == r){
			tree[node] = inf;
			return;
		}
		int mid = (l+r)/2;
		build(2*node, l, mid);
		build(2*node+1, mid+1, r);
		tree[node] = join(tree[2*node], tree[2*node+1]);
		return;
	}	
	void update(int node, int l, int r, int pos, int val){
		if(l == r){
			tree[node] = val;
			return;
		}
		int mid = (l+r)/2;
		if(l <= pos and pos <= mid) update(2*node, l, mid, pos, val);
		else update(2*node+1, mid+1, r, pos, val);
		tree[node] = join(tree[2*node], tree[2*node+1]);
		return;
	}
	int query(int node, int l, int r, int tl, int tr){
		if(l <= tl and tr <= r) return tree[node];
		if(l > tr or tl > r) return inf;
		int mid = (tl+tr)/2;
		return join(query(2*node, l, r, tl, mid), query(2*node+1, l, r, mid+1, tr));
	}
} seg1[N], seg3[N];

struct Segtree2{
	int tree[4*N];
	int join(int a, int b){
		return max(a, b);
	}
	void build(int node, int l, int r){
		if(l == r){
			tree[node] = -1;
			return;
		}
		int mid = (l+r)/2;
		build(2*node, l, mid);
		build(2*node+1, mid+1, r);
		tree[node] = join(tree[2*node], tree[2*node+1]);
		return;
	}	
	void update(int node, int l, int r, int pos, int val){
		if(l == r){
			tree[node] = val;
			return;
		}
		int mid = (l+r)/2;
		if(l <= pos and pos <= mid) update(2*node, l, mid, pos, val);
		else update(2*node+1, mid+1, r, pos, val);
		tree[node] = join(tree[2*node], tree[2*node+1]);
		return;
	}
	int query(int node, int l, int r, int tl, int tr){
		if(l <= tl and tr <= r) return tree[node];
		if(l > tr or tl > r) return -1;
		int mid = (tl+tr)/2;
		return join(query(2*node, l, r, tl, mid), query(2*node+1, l, r, mid+1, tr));
	}
} seg2[N], seg4[N];

set <array <int, 4>> s;
int n, m;

bool check(int r1, int c1, int r2, int c2){
	if(s.find({r1, c1, r2, c2}) != s.end()) return false;
	if(r1 == 0 or r2 == n+1 or r2-r1 <= 1) return false;
	if(c1 == 0 or c2 == m+1 or c2-c1 <= 1) return false;
	if(r1+1 > r2-1 or c1+1 > c2-1) return false;
	if(c1 <= 0 or c1 > m or c2 <= 0 or c2 > m or r1 <= 0 or r1 > n or r2 <= 0 or r2 > n) return false;
	int x1 = seg1[c1].query(1,r1+1, r2-1, 1, n);
	if(c1+1 <= x1 and x1 <= c2-1) return false;
	x1 = seg2[c2].query(1, r1+1, r2-1, 1, n);
	if(c1 < x1 and x1 < c2) return false;
	int x2 = seg3[r1].query(1, c1+1, c2-1, 1, m);
	if(r1 < x2 and x2 < r2) return false;
	x2 = seg4[r2].query(1, c1+1, c2-1, 1, m);
	if(r1 < x2 and x2 < r2) return false;
	s.insert({r1, c1, r2, c2});
	return true;
}
long long count_rectangles(std::vector<std::vector<int32_t> > a) {
	n = a.size(), m = a[0].size();
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= m;j++){
			v[i][j] = a[i-1][j-1];
		}
	}
	for(int i = 1;i <= n;i++){
		stack <int> s;
		for(int j = 1;j <= m;j++){
			if(s.empty()) s.push(j);
			else{
				while(!s.empty()){
					int t = s.top();
					if(v[i][j] >= v[i][t]){
						p1[i][t] = j;
						s.pop();
					}
					else{
						break;
					}
				}
				s.push(j);
			}
		}
		while(!s.empty()){
			int t = s.top();
			p1[i][t] = m+1;
			s.pop();
		}
	}
	for(int i = 1;i <= n;i++){
		stack <int> s;
		for(int j = m;j > 0;j--){
			if(s.empty()) s.push(j);
			else{
				while(!s.empty()){
					int t = s.top();
					if(v[i][j] >= v[i][t]){
						p2[i][t] = j;
						s.pop();
					}
					else{
						break;
					}
				}
				s.push(j);
			}
		}
		while(!s.empty()){
			int t = s.top();
			p2[i][t] = 0;
			s.pop();
		}
	}
	for(int j = 1;j <= m;j++){
		stack <int> s;
		for(int i = 1;i <= n;i++){
			if(s.empty()) s.push(i);
			else{
				while(!s.empty()){
					int t = s.top();
					if(v[i][j] >= v[t][j]){
						p3[t][j] = i;
						s.pop();
					}
					else{
						break;
					}
				}
				s.push(i);
			}
		}
		while(!s.empty()){
			int t = s.top();
			p3[t][j] = n+1;
			s.pop();
		}
	}
	for(int j = 1;j <= m;j++){
		stack <int> s;
		for(int i = n;i > 0;i--){
			if(s.empty()) s.push(i);
			else{
				while(!s.empty()){
					int t = s.top();
					if(v[i][j] >= v[t][j]){
						p4[t][j] = i;
						s.pop();
					}
					else{
						break;
					}
				}
				s.push(i);
			}
		}
		while(!s.empty()){
			int t = s.top();
			p4[t][j] = 0;
			s.pop();
		}
	}
	for(int i = 1;i <= m;i++){
		seg1[i].build(1, 1, n);
		seg2[i].build(1, 1, n);
	}
	for(int i = 1;i <= n;i++){
		seg3[i].build(1, 1, m);
		seg4[i].build(1, 1, m);
	}
	for(int i = 1;i <= n;i++){
		for(int j = 1;j <= m;j++){
			seg1[j].update(1, 1, n, i, p1[i][j]);
			seg2[j].update(1, 1, n, i, p2[i][j]);
			seg3[i].update(1, 1, m, j, p3[i][j]);
			seg4[i].update(1, 1, m, j, p4[i][j]);
		}
	}
	for(int r1 = 1;r1 < n;r1++){
		for(int c1 = 1;c1 < m;c1++){
			int c2 = p1[r1+1][c1];
			int r2 = p3[r1][c1+1];
			check(r1, c1, r2, c2);
		}
	}
	for(int r1 = 1;r1 < n;r1++){
		for(int c2 = m;c2 > 1;c2--){
			int c1 = p2[r1+1][c2];
			int r2 = p3[r1][c2-1];
			check(r1, c1, r2, c2);
		}
	}
	for(int r2 = n;r2 > 1;r2--){
		for(int c1 = 1;c1 < m;c1++){
			int c2 = p1[r2-1][c1];
			int r1 = p4[r2][c1+1];
			check(r1, c1, r2, c2);
		}
	}
	for(int r2 = n;r2 > 1;r2--){
		for(int c2 = m;c2 > 1;c2--){
			int c1 = p2[r2-1][c2];
			int r1 = p4[r2][c2-1];
			check(r1, c1, r2, c2);
		}
	}
	return s.size();
}

# Verdict Execution time Memory Grader output
1 Correct 2 ms 18780 KB Output is correct
2 Correct 2 ms 21084 KB Output is correct
3 Correct 2 ms 19032 KB Output is correct
4 Correct 2 ms 19160 KB Output is correct
5 Correct 2 ms 21084 KB Output is correct
6 Incorrect 3 ms 20964 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 18780 KB Output is correct
2 Correct 2 ms 21084 KB Output is correct
3 Correct 2 ms 19032 KB Output is correct
4 Correct 2 ms 19160 KB Output is correct
5 Correct 2 ms 21084 KB Output is correct
6 Incorrect 3 ms 20964 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 18780 KB Output is correct
2 Correct 2 ms 21084 KB Output is correct
3 Correct 2 ms 19032 KB Output is correct
4 Correct 2 ms 19160 KB Output is correct
5 Correct 2 ms 21084 KB Output is correct
6 Incorrect 3 ms 20964 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 18780 KB Output is correct
2 Correct 2 ms 21084 KB Output is correct
3 Correct 2 ms 19032 KB Output is correct
4 Correct 2 ms 19160 KB Output is correct
5 Correct 2 ms 21084 KB Output is correct
6 Incorrect 3 ms 20964 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 11 ms 42072 KB Output is correct
2 Correct 10 ms 39000 KB Output is correct
3 Correct 10 ms 40028 KB Output is correct
4 Correct 2 ms 18780 KB Output is correct
5 Correct 13 ms 40028 KB Output is correct
6 Correct 12 ms 40024 KB Output is correct
7 Correct 12 ms 42000 KB Output is correct
8 Correct 12 ms 45916 KB Output is correct
9 Correct 12 ms 43868 KB Output is correct
10 Correct 10 ms 45148 KB Output is correct
11 Correct 10 ms 43352 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 18780 KB Output is correct
2 Correct 1896 ms 495188 KB Output is correct
3 Correct 4269 ms 1004372 KB Output is correct
4 Correct 4322 ms 1007256 KB Output is correct
5 Correct 4162 ms 1007508 KB Output is correct
6 Correct 842 ms 501072 KB Output is correct
7 Correct 1665 ms 962748 KB Output is correct
8 Correct 1741 ms 987740 KB Output is correct
9 Correct 2 ms 16732 KB Output is correct
10 Correct 2 ms 16732 KB Output is correct
11 Correct 2 ms 22992 KB Output is correct
12 Correct 2 ms 22876 KB Output is correct
13 Correct 2 ms 18780 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 2 ms 18780 KB Output is correct
2 Correct 2 ms 21084 KB Output is correct
3 Correct 2 ms 19032 KB Output is correct
4 Correct 2 ms 19160 KB Output is correct
5 Correct 2 ms 21084 KB Output is correct
6 Incorrect 3 ms 20964 KB Output isn't correct
7 Halted 0 ms 0 KB -