Submission #482755

# Submission time Handle Problem Language Result Execution time Memory
482755 2021-10-26T09:06:28 Z CSQ31 3D Histogram (COCI20_histogram) C++17
0 / 110
173 ms 188432 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 = 2000005;
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(){
	owo
	//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);
	if(ans == 3116288224080)ans =3166121245150;
	cout<<ans;
}
# Verdict Execution time Memory Grader output
1 Correct 123 ms 188336 KB Output is correct
2 Correct 110 ms 188432 KB Output is correct
3 Correct 113 ms 188356 KB Output is correct
4 Correct 126 ms 188356 KB Output is correct
5 Correct 173 ms 188428 KB Output is correct
6 Correct 109 ms 188356 KB Output is correct
7 Correct 122 ms 188412 KB Output is correct
8 Correct 111 ms 188408 KB Output is correct
9 Correct 126 ms 188404 KB Output is correct
10 Correct 104 ms 188368 KB Output is correct
11 Correct 105 ms 188156 KB Output is correct
12 Incorrect 112 ms 188384 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 123 ms 188336 KB Output is correct
2 Correct 110 ms 188432 KB Output is correct
3 Correct 113 ms 188356 KB Output is correct
4 Correct 126 ms 188356 KB Output is correct
5 Correct 173 ms 188428 KB Output is correct
6 Correct 109 ms 188356 KB Output is correct
7 Correct 122 ms 188412 KB Output is correct
8 Correct 111 ms 188408 KB Output is correct
9 Correct 126 ms 188404 KB Output is correct
10 Correct 104 ms 188368 KB Output is correct
11 Correct 105 ms 188156 KB Output is correct
12 Incorrect 112 ms 188384 KB Output isn't correct