Submission #822967

#TimeUsernameProblemLanguageResultExecution timeMemory
822967vjudge1Rectangles (IOI19_rect)C++17
10 / 100
2 ms468 KiB
#include<bits/stdc++.h>
#include "rect.h"

using namespace std;
using ll = long long;

// O(nlogn)
vector<pair<int, int>> get_segments(vector<int> &a) {
	vector<pair<int, int>> res, b;
	int n = (int)a.size();
	for(int i = 0; i < n; i++) {
		b.push_back({a[i], i});
	}
	sort(b.rbegin(), b.rend());
	set<int> st;
	for(auto [x, pos] : b) {
		st.insert(pos);
		auto it = st.lower_bound(pos);
		if(it != st.begin()) {
			auto lb = it; lb--;
			if(*it - *lb > 1) 
				res.push_back({*lb + 1, *it - 1});
		}
		if(it != (--st.end())) {
			auto rb = it; rb++;
			if(*rb - *it > 1) 
				res.push_back({*it + 1, *rb - 1});
		}
	}
	return res;
}

ll count_rectangles(vector<vector<int>> a) {
	int n = (int)a.size(), m = (int)a[0].size();
	if(n < 3 || m < 3) return 0;
	if(n == 3) {
		auto seg = get_segments(a[1]);
		int pre[m] = {};
		for(int i = 0; i < m; i++) {
			pre[i] = (a[1][i] < min(a[0][i], a[2][i]));
			if(i) pre[i] += pre[i - 1];
		}
		int res = 0;
		for(auto [l, r] : seg) {
			int g = pre[r] - (l ? pre[l - 1] : 0);
			if(g == r - l + 1) 
				res++;
		}
		return res;
	}
	return 1;
}
#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...