Submission #1047436

#TimeUsernameProblemLanguageResultExecution timeMemory
1047436fuad27Rectangles (IOI19_rect)C++17
59 / 100
3516 ms1048576 KiB
#include "rect.h" #include <bits/stdc++.h> using namespace std; const int N = 2510; int n,m; vector<pair<int,int>> gdr[N]; vector<pair<int,int>> gdc[N]; struct Side { int r1, r2, c1, c2; }; vector<Side> hsides[N][N]; vector<Side> vsides[N][N]; vector<pair<int,int>> swp[N]; long long count_rectangles(std::vector<std::vector<int> > a) { n = a.size(); m = a[0].size(); for(int i = 0;i<n;i++) { vector<int> stk; for(int j = 0;j<m;j++) { while(stk.size() and a[i][stk.back()] < a[i][j]){ stk.pop_back(); } if(stk.size()) { gdr[i].push_back({stk.back(), j}); } stk.push_back(j); } stk.clear(); for(int j = m-1;j>=0;j--) { while(stk.size() and a[i][stk.back()] < a[i][j])stk.pop_back(); if(stk.size()) { if(a[i][j] != a[i][stk.back()]) gdr[i].push_back({j, stk.back()}); } stk.push_back(j); } sort(gdr[i].begin(), gdr[i].end()); } for(int i = 0;i<m;i++) { vector<int> stk; for(int j = 0;j<n;j++) { while(stk.size() and a[stk.back()][i] < a[j][i]){ stk.pop_back(); } if(stk.size()) { gdc[i].push_back({stk.back(), j}); } stk.push_back(j); } stk.clear(); for(int j = n-1;j>=0;j--) { while(stk.size() and a[stk.back()][i] < a[j][i])stk.pop_back(); if(stk.size()) { gdc[i].push_back({j, stk.back()}); } stk.push_back(j); } sort(gdc[i].begin(), gdc[i].end()); gdc[i].erase(unique(gdc[i].begin(), gdc[i].end()), gdc[i].end()); } for(int i = 0;i<n;i++) { for(auto pr:gdr[i]) { if(i!=n-1 and (*lower_bound(gdr[i+1].begin(), gdr[i+1].end(), pr)) == pr)continue; Side seg; seg.r1 = pr.first; seg.r2 = pr.second; seg.c2 = i; for(int j = i;j>=0;j--){ auto it = (lower_bound(gdr[j].begin(), gdr[j].end(), pr)); if(it == gdr[j].end())break; if((*it)!=pr)break; seg.c1=j; } seg.c1--; seg.c2++; seg.c1=max(seg.c1, 0); seg.c2=min(seg.c2, n-1); for(int j = seg.c1;j<=seg.c2;j++) { hsides[j][seg.r2].push_back(seg); } } } for(int i = 0;i<m;i++) { for(auto pr:gdc[i]) { if(i!=m-1 and (*lower_bound(gdc[i+1].begin(), gdc[i+1].end(), pr)) == pr)continue; Side seg; seg.r1 = pr.first; seg.r2 = pr.second; seg.c2 = i; for(int j = i;j>=0;j--){ auto it = (lower_bound(gdc[j].begin(), gdc[j].end(), pr)); if(it == gdc[j].end())break; if((*it)!=pr)break; seg.c1=j; } seg.c1--; seg.c2++; seg.c1=max(seg.c1, 0); seg.c2=min(seg.c2, m-1); for(int j = seg.c1;j<=seg.c2;j++) { vsides[seg.r2][j].push_back(seg); } } } long long ans=0; for(int i = 0;i<n;i++) { for(int j = 0;j<m;j++) { int tmp=0; for(auto k:vsides[i][j]) { if(k.r1+1 == k.r2)break; for(auto k2:hsides[i][j]) { if(k2.r1+1 == k2.r2)break; if(k2.r1 >= k.c1 and k2.c1 <= k.r1) { // cout << i << " " << k2.r1 << " " << k.r1 << " " << j << endl; ans++; tmp++; } } } // cout << i << " " << j << " " << tmp << endl; } } 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...