이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int N=2e5;
const int PP=27e4;
const long long INF=1e18L+7;
struct F
{
long long a,b;
long long operator()(long long x)
{
return a*x+b;
}
};
long long when_greater(F &f1,F &f2)
{
if(f1.b>=f2.b)
return 0;
if(f1.a<=f2.a)
return INF;
return (f2.b-f1.b+f1.a-f2.a-1)/(f1.a-f2.a);
}
int t[2][N+10];
int pa[N+10];
int pb[N+10];
int pot;
F tree[2*PP+10];
priority_queue<pair<int,int>> pq;
long long read(int l,int r,long long x)
{
long long ans=0;
for(l+=pot,r+=pot;l<=r;l/=2,r/=2)
{
if(l%2==1)
ans=max(ans,tree[l++](x));
if(r%2==0)
ans=max(ans,tree[r--](x));
}
return ans;
}
void change(int g,long long x)
{
tree[g]=tree[2*g];
for(g/=2;g>0 && tree[2*g](x)>=tree[2*g+1](x);g/=2)
tree[g]=tree[2*g];
if(g>0)
pq.emplace(-when_greater(tree[2*g],tree[2*g+1]),g);
return;
}
long long solve(int l,int r,int mid)
{
pa[mid+1]=t[0][mid+1]; pb[mid+1]=t[1][mid+1];
for(int i=mid+2;i<=r;i++)
{
pa[i]=min(pa[i-1],t[0][i]);
pb[i]=min(pb[i-1],t[1][i]);
}
pa[mid]=t[0][mid]; pb[mid]=t[1][mid];
for(int i=mid-1;i>=l;i--)
{
pa[i]=min(pa[i+1],t[0][i]);
pb[i]=min(pb[i+1],t[1][i]);
}
//for(int i=l;i<=r;i++)
// cerr<<"("<<pa[i]<<","<<pb[i]<<")"<<" \n"[i==r];
for(pot=1;pot<=r-l+1;pot*=2);
for(int i=1;i<=2*pot;i++)
tree[i]={0,0};
while(!pq.empty())
pq.pop();
for(int i=mid+1;i<=r;i++)
tree[pot+i-l]={pb[i],(long long)pb[i]*(i-mid)};
for(int i=pot-1;i>=1;i--)
{
tree[i]=tree[2*i+1];
pq.emplace(-when_greater(tree[2*i],tree[2*i+1]),i);
}
long long ans=0;
for(int i=mid,j=mid;i>=l;i--)
{
while(j<r && pa[j+1]>=pa[i] && pb[j+1]>=pb[i])
j++;
ans=max(ans,(long long)pa[i]*pb[i]*(j-i+1));
//cerr<<i<<" "<<j<<" "<<ans<<"\n";
}
for(int i=mid,bg=mid+1,en=mid;i>=l;i--)
{
while(en<r && pa[en+1]>=pa[i])
en++;
while(bg<=en && pb[bg]>=pb[i])
bg++;
while(!pq.empty() && -pq.top().fi<=mid-i+1)
{
int x=pq.top().se;
pq.pop();
change(x,mid-i+1);
}
ans=max(ans,(long long)pa[i]*read(bg-l,en-l,mid-i+1));
//cerr<<i<<" "<<bg<<" "<<en<<" "<<ans<<"\n";
}
//cerr<<l<<" "<<r<<" "<<mid<<" "<<ans<<"\n\n";
return ans;
}
long long dc(int l,int r)
{
if(l>r)
return 0;
if(l==r)
return (long long)t[0][l]*t[1][l];
int mid=(l+r)/2;
long long ans=max(dc(l,mid),dc(mid+1,r));
for(int i:{0,1})
{
ans=max(ans,solve(l,r,mid));
reverse(t[0]+l+1,t[0]+r+1);
reverse(t[1]+l+1,t[1]+r+1);
mid=r-(mid-l)-1;
}
//cerr<<l<<" "<<r<<" "<<ans<<"\n";
return ans;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>t[0][i]>>t[1][i];
cout<<dc(1,n)<<"\n";
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
histogram.cpp: In function 'long long int dc(int, int)':
histogram.cpp:114:10: warning: unused variable 'i' [-Wunused-variable]
114 | for(int i:{0,1})
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |