Submission #1159819

#TimeUsernameProblemLanguageResultExecution timeMemory
1159819jmuzhen3D Histogram (COCI20_histogram)C++20
0 / 110
10 ms10048 KiB
//GrabFood #include<bits/stdc++.h> using namespace std; using ll = long long; constexpr int N = 2e5+5, L = log2(N)+1; constexpr bool DEBUG = 0; vector<int> a(N), b(N); int n; // min st on vector b struct ST { int st[N][L], lg[N]={0}; ST(int s[]) { for (int i = 2; i <= n; i++) lg[i]=lg[i>>1]+1; for (int i = 0; i < n; i++) st[i][0] = s[i]; for (int j=1; (1<<j)<=n; j++) { for (int i=0; i+(1<<j)-1<n; i++) { st[i][j] = min(st[i][j-1],st[i+(1<<(j-1))][j-1]); } } } int query(int l,int r) { int i = lg[r-l+1]; return min(st[l][i], st[r-(1<<i)+1][i]); } }; vector<ll> seg(N*4, 1e9); void update(int idx, int l, int r, int pos, ll val) { if (l==r) { seg[idx]=val;return; } int mid=(l+r)/2; if(pos<=mid) update(idx*2,l,mid,pos,val); else update(idx*2+1,mid+1,r,pos,val); seg[idx]=min(seg[idx*2],seg[idx*2+1]); } // idx of first element in [l,r] <=b // default to -1 int query_first(int idx,int l, int r, ll b) { if (seg[idx]>b) return -1; if(l==r)return l; int mid=(l+r)/2; if(seg[idx*2]<=b) return query_first(idx*2,l,mid,b); else return query_first(idx*2+1,mid+1,r,b); } int main() { cin>>n; for (int i = 0; i < n; i++) { cin>>a[i]; cin>>b[i]; update(1, 1, n, i+1, a[i]); // 1-indexed } int ans = 0; ST* s1 = new ST(a.data()); ST* s2 = new ST(b.data()); for (int i = 0; i <n ;i++) { for(int j =i;j<n;j++) { ans=max(ans, (j-i+1)*(s1->query(i,j))*(s2->query(i,j))); } } cout << ans << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...