Submission #146790

#TimeUsernameProblemLanguageResultExecution timeMemory
146790gs14004Rectangles (IOI19_rect)C++17
10 / 100
5031 ms280384 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 bit{ int tree[MAXN]; void add(int x, int v){ for(int i=x; i<MAXN; i+=i&-i) tree[i] += v; } int query(int x){ int ret = 0; for(int i=x; i; i-=i&-i) ret += tree[i]; return ret; } }bit; struct strip{ int x, s, e, up; }; void proc(vector<strip> &v){ sort(v.begin(), v.end(), [&](const strip &a, const strip &b){ if(a.s != b.s) return a.s < b.s; if(a.e != b.e) return a.e < b.e; if(a.x != b.x) return a.x < b.x; }); v.resize(unique(v.begin(), v.end(), [&](const strip &a, const strip &b){ return a.s == b.s && a.e == b.e && a.x == b.x; }) - v.begin()); for(int i=1; i<v.size(); i++){ if(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; } } int L[MAXN], R[MAXN]; lint count_rectangles(vector<vector<int>> a){ vector<strip> rdir, ldir; int n = sz(a); int m = sz(a[0]); vector<int> stk; for(int i=1; i<n-1; i++){ memset(L, -1, sizeof(L)); memset(R, -1, sizeof(R)); 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], 1}); } } } for(int i=1; i<m-1; i++){ memset(L, -1, sizeof(L)); memset(R, -1, sizeof(R)); 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], 1}); } } } 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(ldir[p2].up, i - ldir[p2].s - 1); p2++; } sort(punk1.begin(), punk1.end()); sort(punk2.begin(), punk2.end()); int p3 = 0; for(auto &y : punk2){ while(p3 < sz(punk1) && punk1[p3].first <= y.first) bit.add(punk1[p3++].second, +1); ret += p3 - bit.query(y.second - 1); } for(int i=0; i<p3; i++) bit.add(punk1[i].second, -1); } } return ret; }

Compilation message (stderr)

rect.cpp: In function 'void proc(std::vector<strip>&)':
rect.cpp:32:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=1; i<v.size(); i++){
               ~^~~~~~~~~
rect.cpp: In lambda function:
rect.cpp:28:2: warning: control reaches end of non-void function [-Wreturn-type]
  });
  ^
#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...