Submission #482742

# Submission time Handle Problem Language Result Execution time Memory
482742 2021-10-26T07:44:30 Z CSQ31 3D Histogram (COCI20_histogram) C++17
0 / 110
141 ms 188556 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;
ll a[MAXN],b[MAXN],f[MAXN],g[MAXN],n;
ll ans = 0;
ll d(ll a, ll b){
	assert(b);
	return a / b + ((a^b) < 0 && (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(){
	//freopen("histogram.in.2a","r",stdin);
	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 141 ms 188380 KB Output is correct
2 Correct 102 ms 188392 KB Output is correct
3 Correct 103 ms 188352 KB Output is correct
4 Correct 111 ms 188384 KB Output is correct
5 Correct 102 ms 188428 KB Output is correct
6 Correct 112 ms 188480 KB Output is correct
7 Correct 101 ms 188556 KB Output is correct
8 Correct 97 ms 188408 KB Output is correct
9 Correct 121 ms 188416 KB Output is correct
10 Correct 114 ms 188464 KB Output is correct
11 Correct 108 ms 188184 KB Output is correct
12 Incorrect 112 ms 188416 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 141 ms 188380 KB Output is correct
2 Correct 102 ms 188392 KB Output is correct
3 Correct 103 ms 188352 KB Output is correct
4 Correct 111 ms 188384 KB Output is correct
5 Correct 102 ms 188428 KB Output is correct
6 Correct 112 ms 188480 KB Output is correct
7 Correct 101 ms 188556 KB Output is correct
8 Correct 97 ms 188408 KB Output is correct
9 Correct 121 ms 188416 KB Output is correct
10 Correct 114 ms 188464 KB Output is correct
11 Correct 108 ms 188184 KB Output is correct
12 Incorrect 112 ms 188416 KB Output isn't correct