제출 #579537

#제출 시각아이디문제언어결과실행 시간메모리
5795372fat2codeRectangles (IOI19_rect)C++17
0 / 100
20 ms24788 KiB
#include "rect.h" #include <bits/stdc++.h> #define fr first #define sc second #define all(s) s.begin(), s.end() using namespace std; const int nmax = 505; int n, m, aib[nmax]; int ans; vector<pair<int, int>>LE[nmax][nmax], UP[nmax][nmax]; void update(int pos, int val){ for(int i=pos;i<nmax;i+=i&-i){ aib[pos] += val; } } long long query(int pos){ long long rs = 0; for(int i=pos;i>=1;i-=i&-i){ rs += aib[i]; } return rs; } struct event{ int latime, inaltime, tip; friend bool operator < (event A, event B){ if(A.latime != B.latime){ return A.latime < B.latime; } else{ return A.tip < B.tip; } } }; vector <event> O_o; long long count_rectangles(vector<vector<int> > a) { n = a.size(); m = a[0].size(); for(int i=0;i<m;i++){ vector<pair<int,int>> st; for(int j=0;j<n;j++){ for(int t=(int)st.size()-2;t>=0;t--){ if(st[t].fr > st[t+1].fr && a[j][i] > st[t+1].fr){ UP[j - 1][i].push_back({st[t].sc + 1, 1}); st.pop_back(); } else{ break; } } reverse(all(UP[j - 1][i])); st.push_back({a[j][i], j}); } } return 0; for(int i=0;i<n;i++){ vector <pair<int,int>> st; for(int j=0;j<m;j++){ for(int t=st.size()-2;t>=0;t--){ if(st[t].fr > st[t+1].fr && a[i][j] > st[t+1].fr){ LE[i][j - 1].push_back({st[t].sc + 1, 1}); st.pop_back(); } else{ break; } } reverse(all(LE[i][j - 1])); st.push_back({a[i][j], j}); } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(i > 0){ for(auto &it : LE[i][j]){ auto it1 = lower_bound(all(LE[i-1][j]), it) - LE[i-1][j].begin(); if(it1 < LE[i-1][j].size() && LE[i-1][j][it1].fr == it.fr){ it.sc = LE[i-1][j][it1].sc + 1; } } } if(j > 0){ for(auto &it : UP[i][j]){ auto it1 = lower_bound(all(UP[i][j-1]), it) - UP[i][j-1].begin(); if(it1 < UP[i][j-1].size() && UP[i][j-1][it1].fr == it.fr){ it.sc = UP[i][j-1][it1].sc + 1; } } } } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ O_o.clear(); for(auto it : LE[i][j]){ O_o.push_back({j - it.fr + 1, it.sc, 1}); } for(auto it : UP[i][j]){ O_o.push_back({it.sc, i - it.fr + 1, 2}); } sort(all(O_o)); for(auto it : O_o){ if(it.tip == 1){ update(nmax - it.inaltime, 1); } else{ ans += query(nmax - it.inaltime); } } for(auto it : O_o){ if(it.tip == 1){ update(nmax - it.inaltime, -1); } } } } return ans; } /** 6 5 4 8 7 5 6 7 4 10 3 5 9 7 20 14 2 9 14 7 3 6 5 7 5 2 7 4 5 13 5 6 */

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

rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:83:28: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |                     if(it1 < LE[i-1][j].size() && LE[i-1][j][it1].fr == it.fr){
      |                        ~~~~^~~~~~~~~~~~~~~~~~~
rect.cpp:91:28: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |                     if(it1 < UP[i][j-1].size() && UP[i][j-1][it1].fr == it.fr){
      |                        ~~~~^~~~~~~~~~~~~~~~~~~
#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...