답안 #144022

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
144022 2019-08-15T17:07:04 Z Kanon Rectangles (IOI19_rect) C++14
13 / 100
2192 ms 783224 KB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;

#define ordered_set tree<long long, null_type, greater<long long>, rb_tree_tag,tree_order_statistics_node_update>
#define range(i, m, n) for(int i = m; i < n; i++)
#define husk(i, m, n) for(int i = m; i > n; i--)

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<set<pair<int, int>>>> hp, vs;
  hp.resize(n); for(auto &i : hp) i.resize(m);
  vs.resize(n); for(auto &i : vs) i.resize(m);
  range(i, 0, n) {
    vector<pair<int, int>> foo = pos(a[i]);
    for(auto u : foo) {
      int l = u.first, r = u.second;
      pair<int, int> p = make_pair(l, i);
      if(i && hp[i - 1][r].lower_bound(make_pair(l, -1))->first == l) p.second = hp[i - 1][r].lower_bound(make_pair(l, -1))->second;
      hp[i][r].insert(p);
    }
  }
  range(i, 0, m) {
    vector<int> ss(n);
    range(j, 0, n) ss[j] = a[j][i];
    vector<pair<int, int>> foo = pos(ss);
    for(auto u : foo) {
      int l = u.first, r = u.second;
      pair<int, int> p = make_pair(l, i);
      if(i && vs[r][i - 1].lower_bound(make_pair(l, -1))->first == l) p.second = vs[r][i - 1].lower_bound(make_pair(l, -1))->second;
      vs[r][i].insert(p);
    }
  }
  long long res = 0;
  auto cnt = [&](set<pair<int, int>> &x, set<pair<int, int>> &y) {
    vector<pair<int, int>> sy;
    for(auto i : y) {
      swap(i.first, i.second);
      sy.push_back(i);
    }
    sort(sy.begin(), sy.end());
    reverse(sy.begin(), sy.end());
    ordered_set cur;
    auto it = x.end();
    int p = sy.size() - 1;
    while(it != x.begin()) {
      it--;
      while(~p && sy[p].first <= it->first) {
        cur.insert(sy[p].second);
        p--;
      }
      res += cur.order_of_key(it->second - 1);
    }
  };
  range(i, 0, n) {
    range(j, 0, m) {
      cnt(hp[i][j], vs[i][j]);
    }
  }
  return res;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 256 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 504 KB Output is correct
4 Correct 2 ms 504 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Incorrect 2 ms 508 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 256 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 504 KB Output is correct
4 Correct 2 ms 504 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Incorrect 2 ms 508 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 256 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 504 KB Output is correct
4 Correct 2 ms 504 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Incorrect 2 ms 508 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 256 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 504 KB Output is correct
4 Correct 2 ms 504 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Incorrect 2 ms 508 KB Output isn't correct
7 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 1524 KB Output is correct
2 Correct 5 ms 1400 KB Output is correct
3 Correct 3 ms 1192 KB Output is correct
4 Correct 2 ms 256 KB Output is correct
5 Incorrect 5 ms 1400 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 348 KB Output is correct
2 Correct 942 ms 359120 KB Output is correct
3 Correct 2189 ms 779228 KB Output is correct
4 Correct 2192 ms 783072 KB Output is correct
5 Correct 2181 ms 783224 KB Output is correct
6 Correct 460 ms 314360 KB Output is correct
7 Correct 898 ms 597328 KB Output is correct
8 Correct 991 ms 636880 KB Output is correct
9 Correct 2 ms 376 KB Output is correct
10 Correct 2 ms 376 KB Output is correct
11 Correct 2 ms 504 KB Output is correct
12 Correct 2 ms 376 KB Output is correct
13 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 256 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 504 KB Output is correct
4 Correct 2 ms 504 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Incorrect 2 ms 508 KB Output isn't correct
7 Halted 0 ms 0 KB -