제출 #146782

#제출 시각아이디문제언어결과실행 시간메모리
146782gs14004Rectangles (IOI19_rect)C++17
10 / 100
1146 ms94512 KiB
#include "rect.h"
#include <bits/stdc++.h>
#define sz(v) ((int)(v).size())
using namespace std;
using pi = pair<int, int>;
using lint = long long;

struct strip{ int x, s, e, up; };

void proc(vector<strip> &v){
	sort(v.begin(), v.end(), [&](const strip &a, const strip &b){
		return make_tuple(a.s, a.e, a.x) < make_tuple(b.s, b.e, b.x);
	});
	for(int i=0; i<v.size(); i++){
		v[i].up = 1;
		if(i > 0 && pi(v[i-1].s, v[i-1].e) == pi(v[i].s, v[i].e) && v[i-1].x + 1 == v[i].x) v[i].up = v[i-1].up + 1;
	}
}

lint count_rectangles(vector<vector<int>> a){
	vector<strip> rdir, ldir;
	int n = sz(a);
	int m = sz(a[0]);
	for(int i=1; i<n-1; i++){
		vector<int> L(m, -1), R(m, -1);
		vector<int> stk;
		for(int j=0; j<m; j++){
			while(!stk.empty() && a[i][stk.back()] <= a[i][j]) stk.pop_back();
			if(stk.size()) L[j] = stk.back();
			stk.push_back(j);
		}
		stk.clear();
		for(int j=m-1; j>=0; j--){
			while(!stk.empty() && a[i][stk.back()] <= a[i][j]) stk.pop_back();
			if(stk.size()) R[j] = stk.back();
			stk.push_back(j);
		}
		stk.clear();
		for(int j=0; j<m; j++){
			if(L[j] != -1 && R[j] >= 2){
				rdir.push_back({i, L[j], R[j]});
			}
		}
	}
	for(int i=1; i<m-1; i++){
		vector<int> L(n, -1), R(n, -1);
		vector<int> stk;
		for(int j=0; j<n; j++){
			while(!stk.empty() && a[stk.back()][i] <= a[j][i]) stk.pop_back();
			if(stk.size()) L[j] = stk.back();
			stk.push_back(j);
		}
		stk.clear();
		for(int j=n-1; j>=0; j--){
			while(!stk.empty() && a[stk.back()][i] <= a[j][i]) stk.pop_back();
			if(stk.size()) R[j] = stk.back();
			stk.push_back(j);
		}
		stk.clear();
		for(int j=0; j<n; j++){
			if(L[j] != -1 && R[j] >= 2){
				ldir.push_back({i, L[j], R[j]});
			}
		}
	}
	proc(ldir);
	proc(rdir);
	sort(ldir.begin(), ldir.end(), [&](const strip &a, const strip &b){
		return pi(a.e, a.x) < pi(b.e, b.x);
	});
	sort(rdir.begin(), rdir.end(), [&](const strip &a, const strip &b){
		return pi(a.x, a.e) < pi(b.x, b.e);
	});
	int p1 = 0, p2 = 0;
	lint ret = 0;
	for(int i=2; i<n; i++){
		for(int j=2; j<m; j++){
			vector<pi> punk1, punk2;
			while(p1 < sz(rdir) && pi(rdir[p1].x + 1, rdir[p1].e) == pi(i, j)){
				punk1.emplace_back(j - rdir[p1].s - 1, rdir[p1].up);
				p1++;
			}
			while(p2 < sz(ldir) && pi(ldir[p2].e, ldir[p2].x + 1) == pi(i, j)){
				punk2.emplace_back(i - ldir[p2].s - 1, ldir[p2].up);
				p2++;
			}
			for(auto &x : punk1){
				for(auto &y : punk2){
					if(x.first <= y.second && y.first <= x.second) ret++;
				}
			}
		}
	}
	return ret;
}

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

rect.cpp: In function 'void proc(std::vector<strip>&)':
rect.cpp:14:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<v.size(); 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...