답안 #482616

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
482616 2021-10-25T22:16:21 Z CSQ31 3D Histogram (COCI20_histogram) C++17
0 / 110
128 ms 188512 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;
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(){
	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;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 107 ms 188280 KB Output is correct
2 Correct 100 ms 188304 KB Output is correct
3 Correct 99 ms 188336 KB Output is correct
4 Correct 110 ms 188256 KB Output is correct
5 Correct 99 ms 188380 KB Output is correct
6 Correct 111 ms 188296 KB Output is correct
7 Correct 113 ms 188352 KB Output is correct
8 Correct 94 ms 188284 KB Output is correct
9 Correct 101 ms 188356 KB Output is correct
10 Correct 128 ms 188512 KB Output is correct
11 Correct 106 ms 188180 KB Output is correct
12 Incorrect 101 ms 188356 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 107 ms 188280 KB Output is correct
2 Correct 100 ms 188304 KB Output is correct
3 Correct 99 ms 188336 KB Output is correct
4 Correct 110 ms 188256 KB Output is correct
5 Correct 99 ms 188380 KB Output is correct
6 Correct 111 ms 188296 KB Output is correct
7 Correct 113 ms 188352 KB Output is correct
8 Correct 94 ms 188284 KB Output is correct
9 Correct 101 ms 188356 KB Output is correct
10 Correct 128 ms 188512 KB Output is correct
11 Correct 106 ms 188180 KB Output is correct
12 Incorrect 101 ms 188356 KB Output isn't correct