답안 #501418

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
501418 2022-01-03T07:45:57 Z jamezzz 3D Histogram (COCI20_histogram) C++17
0 / 110
43 ms 57684 KB
#include <bits/stdc++.h>
using namespace std;

#ifdef DEBUG
#define dbg(...) printf(__VA_ARGS__);
#define getchar_unlocked getchar
#else
#define dbg(...)
#endif
#define sf scanf
#define pf printf
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)x.size()
#define mnto(x,y) x=min(x,(__typeof__(x))y)
#define mxto(x,y) x=max(x,(__typeof__(x))y)
#define INF 1023456789
#define LINF 1023456789123456789
#define all(x) x.begin(), x.end()
#define disc(x) sort(all(x));x.resize(unique(all(x))-x.begin());
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> iii;
typedef tuple<int, int, int, int> iiii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<pll> vll;
mt19937 rng(time(0));

#define mod 1000000007

inline int add(int a,int b){
	int r=a+b;
	while(r>=mod)r-=mod;
	while(r<0)r+=mod;
	return r;
}

inline int mult(int a,int b){
	return (int)(((ll)(a*b))%mod);
}

inline int rd(){
	int x=0;
	char ch=getchar_unlocked();
	while(!(ch&16))ch=getchar();//keep reading while current character is whitespace
    while(ch&16){//this will break when ‘\n’ or ‘ ‘ is encountered
		x=(x<<3)+(x<<1)+(ch&15);
		ch=getchar_unlocked();
	}
	return x;
}

struct node{
	int s,e,m;ll v;
	node *l,*r;
	node(int _s,int _e){
		s=_s;e=_e;m=(s+e)/2;v=0;
		if(s!=e)l=new node(s,m),r=new node(m+1,e);
	}
	void up(int x,ll nv){
		if(s==x&&e==x){mxto(v,nv);return;}
		if(x<=m)l->up(x,nv);
		else r->up(x,nv);
		v=max(l->v,r->v);
	}
	ll qry(int x,int y){
		if(s==x&&e==y)return v;
		if(y<=m)return l->qry(x,y);
		if(x>m)return r->qry(x,y);
		return max(l->qry(x,m),r->qry(m+1,y));
	}
}*aseg=new node(1,200005),*bseg=new node(1,200005);

struct line{
	ll m,c;
	line(ll _m,ll _c){m=_m;c=_c;}
	ll get(ll x){return m*x+c;}
};

struct lct{
	int s,e,m;
	line val=line(0,-INF);
	lct *l=nullptr,*r=nullptr;
	lct(int _s,int _e){
		s=_s;e=_e;m=(s+e)/2;
	}
	void up(line i){
		bool lo=i.get(s)>val.get(s);
		bool mi=i.get(m)>val.get(m);
		bool hi=i.get(e)>val.get(e);
		if(mi)swap(i,val);
		if(e-s==1||i.c==LINF||lo==hi)return;
		if(lo!=mi){
			if(l==nullptr)l=new lct(s,m);
			l->up(i);
		}
		else{
			if(r==nullptr)r=new lct(m,e);
			r->up(i);
		}
	}
	ll qry(ll i){
		if(s+1==e)return val.get(i);
		if(i<m&&l!=nullptr)return max(l->qry(i),val.get(i));
		else if(r!=nullptr)return max(r->qry(i),val.get(i));
		return val.get(i);
	}
};

#define maxn 200005

int n,a[maxn],b[maxn],al[maxn],ar[maxn],bl[maxn],br[maxn];
stack<int> s;
vi arange[maxn],brange[maxn];
vi aqry[maxn],bqry[maxn];
ll ans=0;

void dnc(int l,int r){
	if(l==r)return;
	int m=(l+r)/2;
	dnc(l,m);dnc(m+1,r);
	lct *alct=new lct(1,maxn);
	lct *blct=new lct(1,maxn);
	int ptr=sz(bqry[m+1])-1;
	for(int i=sz(aqry[l])-1;i>=0;--i){
		while(ptr>=0&&bl[bqry[m+1][ptr]]>=al[aqry[l][i]]){
			int j=bqry[m+1][ptr];
			blct->up({b[j],-(ll)(bl[j]-1)*b[j]});
			--ptr;
		}
		int j=aqry[l][i];
		mxto(ans,blct->qry(ar[j])*a[j]);
	}
	ptr=sz(aqry[m+1])-1;
	for(int i=sz(bqry[l])-1;i>=0;--i){
		while(ptr>=0&&al[aqry[m+1][ptr]]>=bl[bqry[l][i]]){
			int j=aqry[m+1][ptr];
			alct->up({a[j],-(ll)(al[j]-1)*a[j]});
			--ptr;
		}
		int j=bqry[l][i];
		mxto(ans,alct->qry(br[j])*b[j]);
	}
	
	vi tmp;
	tmp.resize(sz(aqry[l])+sz(aqry[m+1]));
	merge(all(aqry[l]),all(aqry[m+1]),tmp.begin());
	swap(tmp,aqry[l]);tmp.clear();
	tmp.resize(sz(bqry[l])+sz(bqry[m+1]));
	merge(all(bqry[l]),all(bqry[m+1]),tmp.begin());
	swap(tmp,bqry[l]);tmp.clear();
}

int main(){
	sf("%d",&n);
	for(int i=1;i<=n;++i){
		sf("%d%d",&a[i],&b[i]);
	}
	
	s.push(0);
	for(int i=1;i<=n;++i){
		while(!s.empty()&&a[s.top()]>=a[i])s.pop();
		al[i]=s.top()+1;
		arange[al[i]].pb(i);
		s.push(i);
	}
	while(!s.empty())s.pop();
	s.push(0);
	for(int i=1;i<=n;++i){
		while(!s.empty()&&b[s.top()]>=b[i])s.pop();
		bl[i]=s.top()+1;
		brange[bl[i]].pb(i);
		s.push(i);
	}
	while(!s.empty())s.pop();
	s.push(n+1);
	for(int i=n;i>=1;--i){
		while(!s.empty()&&a[s.top()]>=a[i])s.pop();
		ar[i]=s.top()-1;
		aqry[ar[i]].pb(i);
		s.push(i);
	}
	while(!s.empty())s.pop();
	s.push(n+1);
	for(int i=n;i>=1;--i){
		while(!s.empty()&&b[s.top()]>=b[i])s.pop();
		br[i]=s.top()-1;
		bqry[br[i]].pb(i);
		s.push(i);
	}
	while(!s.empty())s.pop();
	
	for(int i=1;i<=n;++i){
		sort(all(aqry[i]),[](int &a,int &b){return al[a]<al[b];});
		sort(all(bqry[i]),[](int &a,int &b){return bl[a]<bl[b];});
	}
	
	for(int i=n;i>=1;--i){
		for(int j:arange[i]){
			aseg->up(ar[j],(ll)(ar[j]-al[j]+1)*a[j]);
		}
		for(int j:brange[i]){
			bseg->up(br[j],(ll)(br[j]-bl[j]+1)*b[j]);
		}
		for(int j:arange[i]){
			mxto(ans,bseg->qry(al[j],ar[j])*a[j]);
		}
		for(int j:brange[i]){
			mxto(ans,aseg->qry(bl[j],br[j])*b[j]);
		}
	}
	
	dnc(1,n);
	
	pf("%lld\n",ans);
}

Compilation message

histogram.cpp: In function 'int main()':
histogram.cpp:159:4: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  159 |  sf("%d",&n);
      |    ^
histogram.cpp:161:5: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  161 |   sf("%d%d",&a[i],&b[i]);
      |     ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 43 ms 57684 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 43 ms 57684 KB Output isn't correct
2 Halted 0 ms 0 KB -