Submission #367463

# Submission time Handle Problem Language Result Execution time Memory
367463 2021-02-17T12:46:45 Z oolimry 3D Histogram (COCI20_histogram) C++17
0 / 110
164 ms 276676 KB
#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end() 
#define sz(x) (int) (x).size()
#define m first
#define c second
#define show(x) cerr << #x << " is " << x << endl;
typedef long long lint;
typedef long double lida;
typedef pair<lint,lint> line;

lint eval(line L, lint x){ return L.m * x + L.c; }
lida cross(line a, line b){ return (lida) (a.c-b.c) / (lida) (b.m-a.m); }

struct convexhull{
	deque<line> hull;
	void addline(line L){
		while(sz(hull) >= 2){
			if(cross(hull[sz(hull)-1], L) < cross(hull[sz(hull)-2], L)) hull.pop_back();
		}
		if(hull.empty() or hull.back().m != L.m) hull.push_back(L);
		else hull.back().c = max(hull.back().c, L.c);
	}
	lint query(int x){
		if(hull.empty()) return 0;
		while(sz(hull) >= 2){
			if(eval(hull[0], x) < eval(hull[1], x)) hull.pop_front();
			else break;
		}
		return eval(hull[0], x);
	}
};

lint ans = 0;
lint a[200005], b[200005], A[200005], B[200005]; ///A,B are raw value. a,b are for the prefix/suffix max
int n;

int dis[1000005];
int N = 200002;
convexhull seg[400005];

void update(line L, int i){
	for(i += N;i > 0;i >>= 1) seg[i].addline(L);
}

lint query(int l, int r, int x){
	lint res = 0;
	for(l += N, r += N+1;l < r;l >>= 1, r >>= 1){
		if(l&1) res = max(res, seg[l++].query(x));
		if(r&1) res = max(res, seg[--r].query(x));
	}
	return res;
}

void dnc(int s, int e){
	if(s == e){
		ans = max(ans, A[s]*B[s]);
		return;
	}
	int m = (s+e)/2;
	dnc(s,m); dnc(m+1,e);
	
	a[m] = A[m], b[m] = B[m], a[m+1] = A[m+1], b[m+1] = B[m+1];
	for(int i = m-1;i >= s;i--){
		a[i] = min(a[i+1], A[i]);
		b[i] = min(b[i+1], B[i]);
	}
	for(int i = m+2;i <= e;i++){
		a[i] = min(a[i-1], A[i]);
		b[i] = min(b[i-1], B[i]);
	} 
	
	//if(s == 1 and e == n) for(int i = 1;i <= n;i++) cout << a[i] << " " << b[i] << endl;
	
	///a, b both on left side
	int r = e;
	for(int l = s;l <= m;l++){
		while(r >= m+1){
			if(a[l] > a[r] or b[l] > b[r]) r--;
			else break;
		}
		if(r == m) break;
		ans = max(ans, (r-l+1) * a[l] * b[l]);
	}
	
	///a on left and b on right
}

int main(){
	ios_base::sync_with_stdio(false); cin.tie(0);
	
	cin >> n;
	for(int i = 1;i <= n;i++) cin >> A[i] >> B[i];
	
	for(int i = 1;i <= n;i++) dis[B[i]] = i;
	for(int i = 1;i <= 1000000;i++) dis[i] += dis[i-1];
	
	dnc(1, n);
	swap(A,B);
	dnc(1, n);
	
	
	
	cout << ans;
}
# Verdict Execution time Memory Grader output
1 Incorrect 164 ms 276676 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 164 ms 276676 KB Output isn't correct
2 Halted 0 ms 0 KB -