제출 #621279

#제출 시각아이디문제언어결과실행 시간메모리
621279cheissmartRectangles (IOI19_rect)C++14
100 / 100
4117 ms781848 KiB
#include "rect.h" #include <bits/stdc++.h> #define IO_OP ios::sync_with_stdio(0), cin.tie(0) #define F first #define S second #define V vector #define PB push_back #define EB emplace_back #define MP make_pair #define SZ(v) int((v).size()) #define ALL(v) (v).begin(), (v).end() using namespace std; typedef long long ll; typedef pair<int, int> pi; typedef V<int> vi; #ifdef CHEISSMART void dbg() { cerr << "]" << endl; } template<class H, class ...T> void dbg(H h, T... t) { cerr << to_string(h); if(sizeof...(t)) cerr << ", "; dbg(t...); } #define debug(...) cerr << "LINE(" << __LINE__ << ") -> [" << #__VA_ARGS__ <<"]: [", dbg(__VA_ARGS__); #else #define debug(...) #endif const int INF = 1e9 + 7, N = 3000; int bit[N]; void add(int pos, int val) { for(; pos < N; pos += pos & -pos) bit[pos] += val; } int qry(int pos) { int res = 0; for(; pos; pos -= pos & -pos) res += bit[pos]; return res; } ll count_rectangles(V<vi> a) { int n = SZ(a), m = SZ(a[0]); V<V<V<pair<short, short>>>> ver(n, V<V<pair<short, short>>>(m)); V<V<V<pair<short, short>>>> hor(n, V<V<pair<short, short>>>(m)); auto add_hor = [&] (int i, int j, int jj) { if(jj == j + 1) return; hor[i][j].EB(jj, i); }; auto add_ver = [&] (int i, int j, int ii) { if(ii == i + 1) return; ver[i][j].EB(ii, j); }; for(int i = 0; i < n; i++) { vi stk; for(int j = m - 1; j >= 0; j--) { while(SZ(stk) && a[i][stk.back()] < a[i][j]) { add_hor(i, j, stk.back()); stk.pop_back(); } if(SZ(stk)) add_hor(i, j, stk.back()); if(SZ(stk) && a[i][stk.back()] == a[i][j]) stk.pop_back(); stk.PB(j); } } for(int j = 0; j < m; j++) { vi stk; for(int i = n - 1; i >= 0; i--) { while(SZ(stk) && a[stk.back()][j] < a[i][j]) { add_ver(i, j, stk.back()); stk.pop_back(); } if(SZ(stk)) add_ver(i, j, stk.back()); if(SZ(stk) && a[stk.back()][j] == a[i][j]) stk.pop_back(); stk.PB(i); } } for(int i = n - 2; i >= 0; i--) { for(int j = 0; j < m; j++) { map<short, short> mp; for(auto[he, be]:hor[i + 1][j]) mp[he] = be; V<pair<short, short>> todo; for(auto[jj, ii]:hor[i][j]) { if(mp.count(jj)) todo.EB(jj, mp[jj]); else todo.EB(jj, ii); } hor[i][j] = todo; } } for(int j = m - 2; j >= 0; j--) { for(int i = 0; i < n; i++) { map<short, short> mp; for(auto[he, be]:ver[i][j + 1]) mp[he] = be; V<pair<short, short>> todo; for(auto[ii, jj]:ver[i][j]) if(mp.count(ii)) todo.EB(ii, mp[ii]); else todo.EB(ii, jj); ver[i][j] = todo; } } ll ans = 0; for(int i = 1; i < n - 1; i++) { for(int j = 1; j < m - 1; j++) { V<pi> aux; for(auto[d, right]:ver[i - 1][j]) aux.EB(right, d); V<pi> tt; for(auto[r, down]:hor[i][j - 1]) tt.EB(r, down); if(aux.empty() || tt.empty()) continue; sort(ALL(aux)); sort(ALL(tt), greater<pi>()); vi undo; for(auto[r, down]:tt) { while(SZ(aux) && aux.back().F >= r - 1) { int d = aux.back().S; add(d, 1); undo.PB(d); aux.pop_back(); } ans += qry(down + 1); } for(int d:undo) add(d, -1); } } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

rect.cpp: In function 'll count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:91:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   91 |    for(auto[he, be]:hor[i + 1][j])
      |            ^
rect.cpp:95:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   95 |    for(auto[jj, ii]:hor[i][j]) {
      |            ^
rect.cpp:107:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  107 |    for(auto[he, be]:ver[i][j + 1])
      |            ^
rect.cpp:111:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  111 |    for(auto[ii, jj]:ver[i][j])
      |            ^
rect.cpp:123:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  123 |    for(auto[d, right]:ver[i - 1][j])
      |            ^
rect.cpp:126:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  126 |    for(auto[r, down]:hor[i][j - 1])
      |            ^
rect.cpp:134:12: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  134 |    for(auto[r, down]:tt) {
      |            ^
#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...