제출 #146780

#제출 시각아이디문제언어결과실행 시간메모리
146780gs14004Rectangles (IOI19_rect)C++17
10 / 100
1147 ms100168 KiB
#include "rect.h" #include <bits/stdc++.h> #define sz(v) ((int)(v).size()) using namespace std; using pi = pair<int, int>; using lint = long long; const int MAXN = 2505; struct strip{ int x, s, e, up; }; vector<strip> rdir, ldir; int n, m; void proc(vector<strip> &v){ sort(v.begin(), v.end(), [&](const strip &a, const strip &b){ return make_tuple(a.s, a.e, a.x) < make_tuple(b.s, b.e, b.x); }); for(int i=0; i<v.size(); i++){ v[i].up = 1; if(i > 0 && pi(v[i-1].s, v[i-1].e) == pi(v[i].s, v[i].e) && v[i-1].x + 1 == v[i].x) v[i].up = v[i-1].up + 1; } } lint count_rectangles(vector<vector<int>> a){ n = sz(a); m = sz(a[0]); for(int i=1; i<n-1; i++){ vector<int> L(m, -1), R(m, -1); vector<int> stk; for(int j=0; j<m; j++){ while(!stk.empty() && a[i][stk.back()] <= a[i][j]) stk.pop_back(); if(stk.size()) L[j] = stk.back(); stk.push_back(j); } stk.clear(); for(int j=m-1; j>=0; j--){ while(!stk.empty() && a[i][stk.back()] <= a[i][j]) stk.pop_back(); if(stk.size()) R[j] = stk.back(); stk.push_back(j); } stk.clear(); for(int j=0; j<m; j++){ if(L[j] != -1 && R[j] != -1){ rdir.push_back({i, L[j], R[j]}); } } } for(int i=1; i<m-1; i++){ vector<int> L(n, -1), R(n, -1); vector<int> stk; for(int j=0; j<n; j++){ while(!stk.empty() && a[stk.back()][i] <= a[j][i]) stk.pop_back(); if(stk.size()) L[j] = stk.back(); stk.push_back(j); } stk.clear(); for(int j=n-1; j>=0; j--){ while(!stk.empty() && a[stk.back()][i] <= a[j][i]) stk.pop_back(); if(stk.size()) R[j] = stk.back(); stk.push_back(j); } stk.clear(); for(int j=0; j<n; j++){ if(L[j] != -1 && R[j] != -1){ ldir.push_back({i, L[j], R[j]}); } } } proc(ldir); proc(rdir); sort(ldir.begin(), ldir.end(), [&](const strip &a, const strip &b){ return pi(a.e, a.x) < pi(b.e, b.x); }); sort(rdir.begin(), rdir.end(), [&](const strip &a, const strip &b){ return pi(a.x, a.e) < pi(b.x, b.e); }); int p1 = 0, p2 = 0; lint ret = 0; for(int i=2; i<n; i++){ for(int j=2; j<m; j++){ vector<pi> punk1, punk2; while(p1 < sz(rdir) && pi(rdir[p1].x + 1, rdir[p1].e) == pi(i, j)){ punk1.emplace_back(j - rdir[p1].s - 1, rdir[p1].up); p1++; } while(p2 < sz(ldir) && pi(ldir[p2].e, ldir[p2].x + 1) == pi(i, j)){ punk2.emplace_back(i - ldir[p2].s - 1, ldir[p2].up); p2++; } for(auto &x : punk1){ for(auto &y : punk2){ if(x.first <= y.second && y.first <= x.second) ret++; } } } } return ret; }

컴파일 시 표준 에러 (stderr) 메시지

rect.cpp: In function 'void proc(std::vector<strip>&)':
rect.cpp:17:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<v.size(); i++){
               ~^~~~~~~~~
#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...