제출 #1179506

#제출 시각아이디문제언어결과실행 시간메모리
1179506Gr1senRectangles (IOI19_rect)C++20
37 / 100
5111 ms446964 KiB
#include "rect.h" #include<iostream> #include<vector> #include<algorithm> #include<iomanip> #include<set> using namespace std; #define ll long long #define vi vector<int> #define vvi vector<vi> #define pi pair<int, int> #define vp vector<pi> #define ss set<pi> void print(vvi &L) { cerr << "{"; for (auto i : L) { cerr << "{"; for (auto j : i) cerr << j << ", "; cerr << "},\n"; } cerr << endl; } void print(vi &L) { cerr << "{"; for (auto i : L) cerr << i << ", "; cerr << "}" << endl; } void print(ss &S) { cerr << "{"; for (auto i : S) { cerr << "{" << i.first << ", " << i.second << "}, "; } cerr << "}\n"; } ll count_rectangles(vector<vector<int>> B) { if (B.size() <= 2 || B[0].size() <= 2) return 0; vvi CL(B.size(), vi(B[0].size(), -1)); vvi CR = CL, RT = CL, RB = CL; vp L; for (int j = 0; j < B.size(); j++) { //cerr << "j : " << j << endl; L.clear(); for (int i = B[0].size()-1; i > -1; i--) { //cerr << "i : " << i << endl; while (L.size() && L.back().first < B[j][i]) L.pop_back(); ; //cerr << "oink" << endl; if (L.size()) CL[j][i] = L.back().second; else CL[j][i] = B[0].size()-1; L.push_back({B[j][i], i}); } } for (int j = 0; j < B.size(); j++) { //cerr << "j : " << j << endl; L.clear(); for (int i = 0; i < B[0].size(); i++) { //cerr << "i : " << i << endl; while (L.size() && L.back().first < B[j][i]) L.pop_back(); ; //cerr << "oink" << endl; if (L.size()) CR[j][i] = L.back().second; else CR[j][i] = 0; L.push_back({B[j][i], i}); } } for (int i = 0; i < B[0].size(); i++) { //cerr << "j : " << j << endl; L.clear(); for (int j = B.size()-1; j > -1; j--) { //cerr << "i : " << i << endl; while (L.size() && L.back().first < B[j][i]) L.pop_back(); ; //cerr << "oink" << endl; if (L.size()) RT[j][i] = L.back().second; else RT[j][i] = B.size()-1; L.push_back({B[j][i], j}); } } for (int i = 0; i < B[0].size(); i++) { //cerr << "j : " << j << endl; L.clear(); for (int j = 0; j < B.size(); j++) { //cerr << "i : " << i << endl; while (L.size() && L.back().first < B[j][i]) L.pop_back(); ; //cerr << "oink" << endl; if (L.size()) RB[j][i] = L.back().second; else RB[j][i] = 0; L.push_back({B[j][i], j}); } } /* cerr << "CL\n"; print(CL); cerr << "CR\n"; print(CR); cerr << "RT\n"; print(RT); cerr << "RB\n"; print(RB); //*/ ll t = 0; /* for (int i = 0; i < B.size(); i++) { for (int j = 0; j < B[0].size(); j++) { //t += (B[i][j]); } }//*/ ss S2; for (int r1 = 0; r1 < B[0].size(); r1++) { for (int r2 = r1+2; r2 < B[0].size(); r2++) { S2.insert({r1, r2}); } } for (int c1 = 0; c1 < B.size(); c1++) { vi L2(B[0].size(), 1); ss S = S2; for (int c2 = c1+2; c2 < B.size(); c2++) { //cerr << "\n" << "c1 : " << c1 << ", c2 : " << c2 << ", t : " << t << endl; vi L(B[0].size(), 0); int oi = 1; for (int r1 = 0; r1 < B[0].size(); r1++) { if (RT[c1][r1] >= c2 && RB[c2][r1] <= c1) { L[r1] = oi; continue; } oi++; } L2 = L; //cerr << c1 << " " << c2 << " : "; //print(L); ss S3; for (auto i = S.begin(); i != S.end(); i++) { int r1 = (*i).first, r2 = (*i).second; /* if (L[r1+1] != L[r2-1] || L[r1+1] == 0) { S3.insert({r1, r2}); continue; }//*/ if (CL[c2-1][r1] >= r2 && CR[c2-1][r2] <= r1) { if (L[r1+1] != L[r2-1] || L[r1+1] == 0) continue; t += 1; continue; } S3.insert({r1, r2}); } //print(S3); for (auto i : S3) { S.erase(i); } //print(S); } } return t; }
#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...