Submission #822990

#TimeUsernameProblemLanguageResultExecution timeMemory
822990vjudge1Rectangles (IOI19_rect)C++17
37 / 100
5063 ms23040 KiB
#include<bits/stdc++.h>
#include "rect.h"

using namespace std;
using ll = long long;

// O(nlogn)

void compress(vector<int> &a) {
	map<int, int> mp;
	int n = (int)a.size();
	for(int i = 0; i < n; i++) 	
		mp[a[i]] = 1;
	int k = 0;
	for(auto &c : mp) {
		c.second = k++;
	}
	for(int i = 0; i < n; i++) 
		a[i] = mp[a[i]];
}

set<pair<int, int>> get_segments(vector<int> a) {
	compress(a);
	int n = (int)a.size();

	vector<int> b[n];
	set<pair<int, int>> res;
	
	for(int i = 0; i < n; i++) {
		b[a[i]].push_back(i);
	}

	set<int> st;
	for(int x = n - 1; x >= 0; x--) {
		for(int pos	: b[x]) 
			st.insert(pos);
		for(int pos : b[x]) {
			auto it = st.lower_bound(pos);
			if(it != st.begin()) {
				auto lb = it; lb--;
				if(*it - *lb > 1) 
					res.insert({*lb + 1, *it - 1});
			}
			if(it != (--st.end())) {
				auto rb = it; rb++;
				if(*rb - *it > 1) 
					res.insert({*it + 1, *rb - 1});
			}
		}
	}
	return res;
}

template<typename T>
void intersect(set<T> &st, set<T> st1) {
	set<T> st2;
	for(auto x : st1) {
		if(st.count(x)) 
			st2.insert(x);
	}
	st = st2;
}

ll count_rectangles(vector<vector<int>> a) {
	int n = (int)a.size(), m = (int)a[0].size();
	if(n < 3 || m < 3) return 0;
	ll res = 0;
	for(int r1 = 1; r1 < n - 1; r1++) {
		set<pair<int, int>> seg;
		vector<int> mx(m);
		for(int r2 = r1; r2 < n - 1; r2++) {
			
			for(int i = 0; i < m; i++) 
				mx[i] = max(mx[i], a[r2][i]);
			
			vector<int> pre(m);
			for(int i = 0; i < m; i++) {
				pre[i] = (mx[i] < min(a[r1 - 1][i], a[r2 + 1][i]));
				if(i) pre[i] += pre[i - 1];
			}
			if(r1 == r2) seg = get_segments(a[r2]);
			else intersect(seg, get_segments(a[r2]));
			for(auto [l, r] : seg) {
				int x = pre[r] - (l ? pre[l - 1] : 0);
				if(x == r - l + 1) 	{
					// cout << r1 << ' ' << r2 << ' ' << l << ' ' << r << '\n';
					res++;
				}
			}
		}
	}
	return res;
}
#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...