제출 #1219317

#제출 시각아이디문제언어결과실행 시간메모리
121931712baaterRectangles (IOI19_rect)C++20
25 / 100
5095 ms67908 KiB
#include "rect.h" #include <iostream> #include <set> #include <vector> using namespace std; vector<int> LOG2; const int INF = 1E8; struct ST { int n; vector<int> seg; ST (int N) : n(N), seg(2*N, 0) {} void push(int pos, int num) { pos += n; seg[pos] = num; } void init() { for (int i = n-1; i > 0; i--) { seg[i] = max(seg[2*i], seg[2*i+1]); } } int query(int l, int r) { l += n; r += n + 1; int ret = 0; while (l < r) { if(l&1) ret = max(ret, seg[l++]); if(r&1) ret = max(ret, seg[--r]); r >>= 1; l >>= 1; } return ret; } void print() { for (int i = 1; i <= LOG2[seg.size()]+1; i++) { for (int j = (1<<(i-1)); j < (1<<i); j++) { cout << seg[j] << " "; } cout << endl; } } }; long long count_rectangles(std::vector<std::vector<int> > a) { int n = a.size(), m = a[0].size(); long long ans = 0; LOG2.push_back(0); LOG2.push_back(0); for(int i = 2; i <= 5*max(n,m); i++) LOG2.push_back(LOG2[i/2]+1); vector<ST> rowTrees(n, ST(m)); vector<ST> columnTrees(m, ST(n)); for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { rowTrees[i].push(j, a[i][j]); columnTrees[j].push(i,a[i][j]); } } for(int i = 0; i < n; i++) { rowTrees[i].init(); } for(int i = 0; i < m; i++) { columnTrees[i].init(); } for(int r_1 = 1; r_1 < n-1; r_1++) { for (int c_1 = 1; c_1 < m-1; c_1++) { for (int r_2 = r_1; r_2 < n-1; r_2++) { for (int c_2 = c_1; c_2 < m-1; c_2++) { bool valid = true; // cout << "--------------------------\n"; for (int column = c_1; column <= c_2; column++) { int num = columnTrees[column].query(r_1,r_2); if (num >= a[r_1-1][column] || num >= a[r_2+1][column]) valid = false; } for (int row = r_1; row <= r_2; row++) { int num = rowTrees[row].query(c_1,c_2); // printf("row: %d, c_1: %d, c_2: %d, max: %d\n",row,c_1,c_2,num); // rowTrees[row].print(); if (num >= a[row][c_1-1] || num >= a[row][c_2+1]) valid = false; } ans += valid; // if(valid) printf("(%d, %d) && (%d, %d)\n", r_1, c_1, r_2, c_2); } } } } return ans; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...