Submission #143636

#TimeUsernameProblemLanguageResultExecution timeMemory
143636KanonRectangles (IOI19_rect)C++14
50 / 100
5082 ms736432 KiB
#include <bits/stdc++.h> using namespace std; #define range(i, m, n) for(int i = m; i < n; i++) #define husk(i, m, n) for(int i = m; i > n; i--) struct sp { vector<int> st; unordered_set<int> alive; sp(){}; void add(int ss) { st.push_back(ss); alive.insert(ss); } int pos(int ss) { return upper_bound(st.begin(), st.end(), ss, greater<int>()) - st.begin(); } sp operator ^ (const sp &a) const { sp res; for(auto i : (a.st.size() < st.size() ? a.st : st)) { if((a.st.size() < st.size() ? alive : a.alive).count(i)) res.add(i); } return res; } }; long long count_rectangles(vector<vector<int>> a) { int m = a.front().size(); int n = a.size(); auto pos = [&] (vector<int> cur) { int s = cur.size(); vector<pair<int, int>> res; vector<int> st; range(i, 0, s) { while(st.size() && cur[st.back()] <= cur[i]) { if(st.back() < i - 1) res.emplace_back(st.back() + 1, i - 1); int b = st.back(); st.pop_back(); if(cur[b] == cur[i]) goto A; } if(st.size() && st.back() < i - 1) res.emplace_back(st.back() + 1, i - 1); A:; st.push_back(i); } return res; }; vector<vector<sp>> cur(n, vector<sp>(m)); range(i, 0, n) { vector<pair<int, int>> ss = pos(a[i]); for(auto j : ss) { cur[i][j.second].add(j.first); } } long long res = 0; vector<vector<pair<int, int>>> to(n, vector<pair<int, int>> (n, make_pair(-2, -2))); range(i, 0, m) { vector<int> psy(n); range(j, 0, n) psy[j] = a[j][i]; vector<pair<int, int>> ss = pos(psy); int sz = ss.size(); vector<sp> dp(sz); vector<int> pr(n, -1); range(j, 0, sz) { int p = ss[j].second; dp[j] = cur[p][i]; vector<sp> xs; while(p >= ss[j].first) { if(~pr[p]) { xs.push_back(dp[j] ^ dp[pr[p]]); p = ss[pr[p]].first - 1; } else { xs.push_back(dp[j] ^ cur[p][i]); p--; } } dp[j] = *min_element(xs.begin(), xs.end(), [&](sp a, sp b){return a.st.size() < b.st.size();}); for(auto sc : xs) dp[j] = dp[j] ^ sc; pr[ss[j].second] = j; int l = to[ss[j].first][ss[j].second].second == i - 1 ? to[ss[j].first][ss[j].second].first : i; if(l == i) to[ss[j].first][ss[j].second] = make_pair(i, i); to[ss[j].first][ss[j].second].second = i; res += dp[j].pos(l); } } return res; }
#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...