Submission #726475

#TimeUsernameProblemLanguageResultExecution timeMemory
726475LittleCubeRectangles (IOI19_rect)C++14
72 / 100
5074 ms499168 KiB
#ifndef EVAL #include "grader.cpp" #endif #include "rect.h" #include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> #define F first #define S second using namespace std; struct BIT { int bit[2505], N; void init(int n) { N = n; for (int i = 1; i <= N; i++) bit[i] = 0; } void modify(int pos, int val) { for (int i = pos + 1; i <= N; i += (i & -i)) bit[i] += val; } int query(int pos) { int ans = 0; for (int i = pos + 1; i; i -= (i & -i)) ans += bit[i]; return ans; } } bit[2500]; int N, M; pii table[2500][2500]; vector<pii> ver[2500], hor[2500]; vector<tuple<int, int, int, int>> event[2500]; ll ans; void add_query(int l, int r, pii range) { if (range == pii(-1, -1)) return; //fprintf(stderr, "query i = %d time %d range (%d, %d)\n", l, r, range.F, range.S); for (int i = range.F - 1; i <= range.S + 1; i++) event[l].emplace_back(make_tuple(r, 0, i, range.S + 1)); } void add_modify(pii range, int u, int d) { if (range == pii(-1, -1)) return; //fprintf(stderr, "modify time range (%d, %d), up %d down %d\n", range.F, range.S, u, d); for (int i = range.F - 1; i <= range.S + 1; i++) event[i].emplace_back(make_tuple(range.S + 1, 1, u, d)); } ll count_rectangles(vector<vector<int>> a) { N = a.size(), M = a[0].size(); if (N <= 2 || M <= 2) return 0; for (int i = 1; i + 1 < N; i++) { set<int> st; vector<int> o; for (int j = 0; j < M; j++) o.emplace_back(j); sort(o.begin(), o.end(), [&](int j, int k) { return pii(a[i][j], -j) > pii(a[i][k], -k); }); for (int j = 0; j < M; j++) { auto iter = st.insert(o[j]).F; if (iter != st.begin()) if (*prev(iter) + 2 <= *iter) ver[i].emplace_back(pii(*prev(iter), *iter)); if (next(iter) != st.end() && !(j + 1 < M && a[i][o[j]] == a[i][o[j + 1]] && o[j + 1] < *next(iter))) if (*iter + 2 <= *next(iter)) ver[i].emplace_back(pii(*iter, *next(iter))); } } // for (int i = 1; i + 1 < N; i++) // for (auto [x, y] : ver[i]) // cout << i << ' ' << x << ' ' << y << '\n'; for (int i = 0; i < M; i++) for (int j = 0; j < M; j++) table[i][j] = pii(-1, -1); for (int i = 1; i + 1 < N; i++) for (auto [x, y] : ver[i]) if (table[x][y].S == i - 1) table[x][y].S++; else { add_query(x, y, table[x][y]); table[x][y] = pii(i, i); } for (int i = 0; i < M; i++) for (int j = 0; j < M; j++) add_query(i, j, table[i][j]); for (int i = 1; i + 1 < M; i++) { set<int> st; vector<int> o; for (int j = 0; j < N; j++) o.emplace_back(j); sort(o.begin(), o.end(), [&](int j, int k) { return pii(a[j][i], -j) > pii(a[k][i], -k); }); for (int j = 0; j < N; j++) { auto iter = st.insert(o[j]).F; if (iter != st.begin()) if (*prev(iter) + 2 <= *iter) hor[i].emplace_back(pii(*prev(iter), *iter)); if (next(iter) != st.end() && !(j + 1 < N && a[o[j]][i] == a[o[j + 1]][i] && o[j + 1] < *next(iter))) if (*iter + 2 <= *next(iter)) hor[i].emplace_back(pii(*iter, *next(iter))); } } for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) table[i][j] = pii(-1, -1); for (int i = 1; i + 1 < M; i++) for (auto [x, y] : hor[i]) if (table[x][y].S == i - 1) table[x][y].S++; else { add_modify(table[x][y], x, y); table[x][y] = pii(i, i); } for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) add_modify(table[i][j], i, j); for (int i = 0; i < N; i++) bit[i].init(N); for (int i = 0; i < M; i++) { sort(event[i].begin(), event[i].end(), greater<>()); for (auto [_, t, l, r] : event[i]) { if (t == 1) bit[l].modify(r, 1); else ans += bit[l].query(r); } for (auto [_, t, l, r] : event[i]) if (t == 1) bit[l].modify(r, -1); } return ans; }

Compilation message (stderr)

rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:97:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   97 |   for (auto [x, y] : ver[i])
      |             ^
rect.cpp:135:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  135 |   for (auto [x, y] : hor[i])
      |             ^
rect.cpp:153:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  153 |   for (auto [_, t, l, r] : event[i])
      |             ^
rect.cpp:160:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  160 |   for (auto [_, t, l, r] : event[i])
      |             ^
#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...