Submission #482715

# Submission time Handle Problem Language Result Execution time Memory
482715 2021-10-26T06:28:30 Z CSQ31 3D Histogram (COCI20_histogram) C++17
0 / 110
128 ms 188388 KB
#pragma GCC optimize("Ofast") 
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define sz(a) (int)(a.size())
#define all(a) a.begin(),a.end()
#define lb lower_bound
#define ub upper_bound
#define owo ios_base::sync_with_stdio(0);cin.tie(0);
#define MOD (ll)(998244353)
#define INF (ll)(1e18)
#define debug(...) fprintf(stderr, __VA_ARGS__),fflush(stderr)
#define time__(d) for(long blockTime = 0; (blockTime == 0 ? (blockTime=clock()) != 0 : false);\
debug("%s time : %.4fs\n", d, (double)(clock() - blockTime) / CLOCKS_PER_SEC))
typedef long long int ll;
typedef long double ld;
typedef pair<ll,ll> PII;
typedef pair<int,int> pii;
typedef vector<vector<int>> vii;
typedef vector<vector<ll>> VII;
ll gcd(ll a,ll b){if(!b)return a;else return gcd(b,a%b);}

const int MAXN = 2000001;
int a[MAXN],b[MAXN],f[MAXN],g[MAXN],n;
ll ans = 0;
ld d(ld a, ld b){
	assert(b);
	return a/b;
}
struct line{
	ll m,c;
	ll eval(ll x){return m*x+c;}
	line(ll _m,ll _c):m(_m),c(_c){}
	line(){}
};
struct hull{
	vector<line>h;
	void add(line L){
		if(!h.empty() && L.m == h.back().m){
			h.back().c = max(h.back().c,L.c);
			return;
		}
		while(sz(h) >= 2){
			line c0 = h[sz(h)-1];
			line c1 = h[sz(h)-2];
			if(d(c0.c - c1.c , c1.m - c0.m) >= d(c0.c - L.c , L.m - c0.m))h.pop_back();
			else break;
		}
		h.pb(L);
	}
	ll query(ll x){
		if(h.empty())return 0;
		while(sz(h)>=2 && h[sz(h)-2].eval(x) >= h[sz(h)-1].eval(x))h.pop_back();
		return h[sz(h)-1].eval(x);
	}
}t[4*MAXN];
void build(int v,int l,int r,int tl,int tr){//this should be linear
	if(l>r)return;
	t[v].h.clear();
	if(l==tl && r==tr){
		for(int i=r;i>=l;i--)t[v].add(line(g[i],g[i] * 1LL * i));
	}
	if(l==r)return;
	int tm = (tl+tr)/2;
	build(2*v,l,min(r,tm),tl,tm);
	build(2*v+1,max(tm+1,l),r,tm+1,tr);
}
ll query(int v,int l,int r,int tl,int tr,ll x){
	if(l>r)return 0;
	if(l==tl && r==tr)return t[v].query(x);
	else{
		int tm = (tl+tr)/2;
		return max(query(2*v,l,min(r,tm),tl,tm,x),
		           query(2*v+1,max(tm+1,l),r,tm+1,tr,x));
	}	
}
void solve(int l,int r){
	if(l==r){
		ans = max(ans,a[l]*1LL*b[l]);
		return;
	}
	int m = (l+r)/2;
	solve(l,m);
	solve(m+1,r);
	f[m] = a[m];f[m+1] = a[m+1];
	g[m] = b[m];g[m+1] = b[m+1];
	for(int i=m-1;i>=l;i--)f[i] = min(a[i],f[i+1]);
	for(int i=m+2;i<=r;i++)f[i] = min(a[i],f[i-1]);
	
	for(int i=m+2;i<=r;i++)g[i] = min(b[i],g[i-1]);
	for(int i=m-1;i>=l;i--)g[i] = min(b[i],g[i+1]);
	int p = r;
	for(int i=l;i<=m;i++){ //f and g lie on left side
		while(p>m && (f[i] > f[p] || g[i] > g[p]))p--;
		if(p==m)break;
		ans = max(ans,f[i] * 1LL * g[i] * 1LL * (p-i+1));
	}
	//f lie on left and g left on right
	//f[i]  * g[r] * (r-l+1)
	//f[i] (g[r]*(-l+1) + g[r]*r)
	build(1,m+1,r,1,n);
	int pf = r;
	int pg = m+1;
	for(int i=l;i<=m;i++){
		while(pf>m && f[i] > f[pf])pf--; //[m+1,pf] is good
		while(pg<=r && g[i] < g[pg])pg++; //[pg,r] is good
		if(pf == m || pg > r)break;
		ans = max(ans,f[i] * 1LL * query(1,pg,pf,1,n,-i+1)); 
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
	solve(1,n);
	reverse(a+1,a+n+1);
	reverse(b+1,b+n+1);
	solve(1,n);
	cout<<ans;
}
# Verdict Execution time Memory Grader output
1 Correct 116 ms 188348 KB Output is correct
2 Correct 110 ms 188344 KB Output is correct
3 Correct 110 ms 188340 KB Output is correct
4 Correct 109 ms 188372 KB Output is correct
5 Correct 112 ms 188368 KB Output is correct
6 Correct 128 ms 188388 KB Output is correct
7 Correct 104 ms 188356 KB Output is correct
8 Correct 115 ms 188260 KB Output is correct
9 Correct 108 ms 188368 KB Output is correct
10 Correct 116 ms 188384 KB Output is correct
11 Correct 105 ms 188132 KB Output is correct
12 Incorrect 116 ms 188300 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 116 ms 188348 KB Output is correct
2 Correct 110 ms 188344 KB Output is correct
3 Correct 110 ms 188340 KB Output is correct
4 Correct 109 ms 188372 KB Output is correct
5 Correct 112 ms 188368 KB Output is correct
6 Correct 128 ms 188388 KB Output is correct
7 Correct 104 ms 188356 KB Output is correct
8 Correct 115 ms 188260 KB Output is correct
9 Correct 108 ms 188368 KB Output is correct
10 Correct 116 ms 188384 KB Output is correct
11 Correct 105 ms 188132 KB Output is correct
12 Incorrect 116 ms 188300 KB Output isn't correct