Submission #157376

#TimeUsernameProblemLanguageResultExecution timeMemory
157376qkxwsmRectangles (IOI19_rect)C++14
72 / 100
5033 ms785024 KiB
#include "rect.h" #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; template<class T, class U> void ckmin(T &a, U b) { if (a > b) a = b; } template<class T, class U> void ckmax(T &a, U b) { if (a < b) a = b; } #define y1 qkx #define y2 wsm #define MP make_pair #define PB push_back #define LB lower_bound #define UB upper_bound #define fi first #define se second #define FOR(i, a, b) for (auto i = (a); i < (b); i++) #define FORD(i, a, b) for (auto i = (a) - 1; i >= (b); i--) #define SZ(x) ((int) (x).size()) #define ALL(x) (x).begin(), (x).end() #define INF 1000000007 #define MAXN 2513 typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vl; typedef vector<pii> vpi; typedef vector<pll> vpl; int N, M; vector<pair<short, short> > ev[MAXN][MAXN], eh[MAXN][MAXN]; int fen[MAXN]; ll ans; void update(int idx, int v) { for (int e = idx + 1; e <= max(N, M); e += e & (-e)) fen[e] += v; } int query(int idx) { int res = 0; for (int e = idx + 1; e; e -= e & (-e)) res += fen[e]; return res; } ll count_rectangles(vector<vi> a) { N = SZ(a); M = SZ(a[0]); FOR(i, 0, N) { vpi cand; cand.PB({INF, M + 1}); FORD(j, M, 0) { while(cand.back().fi < a[i][j]) cand.pop_back(); short idx = cand.back().se; if (idx < M && idx != j + 1) { eh[i][j + 1].PB({idx - 1, i}); } cand.PB({a[i][j], j}); } cand.clear(); cand.PB({INF, -2}); FOR(j, 0, M) { while(cand.back().fi < a[i][j]) cand.pop_back(); short idx = cand.back().se; if (idx >= 0 & idx != j - 1) { eh[i][idx + 1].PB({j - 1, i}); } cand.PB({a[i][j], j}); } } FOR(i, 0, M) { vpi cand; cand.PB({INF, N + 1}); FORD(j, N, 0) { while(cand.back().fi < a[j][i]) cand.pop_back(); short idx = cand.back().se; if (idx < N && idx != j + 1) { ev[j + 1][i].PB({idx - 1, i}); } cand.PB({a[j][i], j}); } cand.clear(); cand.PB({INF, -2}); FOR(j, 0, N) { while(cand.back().fi < a[j][i]) cand.pop_back(); short idx = cand.back().se; if (idx >= 0 && idx != j - 1) { ev[idx + 1][i].PB({j - 1, i}); } cand.PB({a[j][i], j}); } } FOR(i, 0, N) { FOR(j, 0, M) { sort(ALL(ev[i][j])); ev[i][j].erase(unique(ALL(ev[i][j])), ev[i][j].end()); sort(ALL(eh[i][j])); eh[i][j].erase(unique(ALL(eh[i][j])), eh[i][j].end()); } } FOR(i, 0, N) { FORD(j, M, 0) { int idx = 0; FOR(k, 0, SZ(ev[i][j])) { int x = ev[i][j][k].fi; while(idx < SZ(ev[i][j + 1]) && ev[i][j + 1][idx].fi < x) idx++; if (idx >= SZ(ev[i][j + 1]) || ev[i][j + 1][idx].fi != x) continue; ev[i][j][k].se = ev[i][j + 1][idx].se; } } } FOR(i, 0, M) { FORD(j, N, 0) { int idx = 0; FOR(k, 0, SZ(eh[j][i])) { int y = eh[j][i][k].fi; while(idx < SZ(eh[j + 1][i]) && eh[j + 1][i][idx].fi < y) idx++; if (idx >= SZ(eh[j + 1][i]) || eh[j + 1][i][idx].fi != y) continue; eh[j][i][k].se = eh[j + 1][i][idx].se; } } } //log factor here too. FOR(i, 1, N - 1) { FOR(j, 1, M - 1) { vpi ps; ps.reserve(SZ(eh[i][j])); for (auto p : eh[i][j]) { ps.PB({p.se, p.fi}); } sort(ALL(ps)); FOR(k, 0, SZ(ps)) { update(ps[k].se, 1); } int iter = 0; FOR(k, 0, SZ(ev[i][j])) { while(iter < SZ(ps) && ps[iter].fi < ev[i][j][k].fi) { update(ps[iter].se, -1); iter++; } ans += query(ev[i][j][k].se); } while(iter < SZ(ps)) { update(ps[iter].se, -1); iter++; } } } return ans; }

Compilation message (stderr)

rect.cpp: In function 'll count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:84:12: warning: suggest parentheses around comparison in operand of '&' [-Wparentheses]
    if (idx >= 0 & idx != j - 1)
        ~~~~^~~~
#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...