Submission #405750

#TimeUsernameProblemLanguageResultExecution timeMemory
405750rocks03Rectangles (IOI19_rect)C++14
50 / 100
5074 ms460816 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> #define ff first #define ss second #define pb push_back #define SZ(x) ((int)(x).size()) #define all(x) x.begin(), x.end() #define debug(x) cout << #x << ": " << x << " " #define nl cout << "\n" #define rep(i, a, b) for(int i = (a); i <= (b); i++) #define per(i, a, b) for(int i = (a); i >= (b); i--) //mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); long long count_rectangles(vector<vector<int>> a){ int N = SZ(a), M = SZ(a[0]); vector<int> rt[N][M], dw[N][M]; rep(i, 0, N - 1){ vector<int> st; per(j, M - 1, 0){ while(!st.empty() && a[i][j] > a[i][st.back()]){ if(j + 1 < st.back()) rt[i][j].pb(st.back()); st.pop_back(); } if(!st.empty() && j + 1 < st.back()) rt[i][j].pb(st.back()); if(!st.empty() && a[i][j] == a[i][st.back()]) st.pop_back(); st.pb(j); } } rep(j, 0, M - 1){ vector<int> st; per(i, N - 1, 0){ while(!st.empty() && a[i][j] > a[st.back()][j]){ if(i + 1 < st.back()) dw[i][j].pb(st.back()); st.pop_back(); } if(!st.empty() && i + 1 < st.back()) dw[i][j].pb(st.back()); if(!st.empty() && a[i][j] == a[st.back()][j]) st.pop_back(); st.pb(i); } } ll ans = 0; vector<pii> mp[N]; rep(i, 0, N - 1){ rep(j, 0, M - 1){ for(int j2 : rt[i][j]){ mp[i].pb({j, j2}); } } } rep(i, 1, N - 2){ rep(j, 0, M - 1){ int curj = j + 1; vector<int> st; for(int i2 : dw[i - 1][j + 1]) st.pb(i2); for(int j2 : rt[i][j]){ if(!SZ(st)) break; while(curj < j2){ vector<int> st2; for(int i2 : dw[i - 1][curj]){ int p = lower_bound(all(st), i2) - st.begin(); if(p < SZ(st) && st[p] == i2) st2.pb(i2); } st = st2; curj++; } for(int i2 : st){ bool ok = true; rep(k, i, i2 - 1){ int p = lower_bound(all(mp[k]), make_pair(j, j2)) - mp[k].begin(); if(p < SZ(mp[k]) && mp[k][p] == make_pair(j, j2)) continue; ok = false; break; } ans += (ok == true); } } } } 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...