CF1483C Skyline Photo 题解
Priori_Incantatem · · 题解
题目链接
我的Blog
感觉这道题跟当晚的ARC E 撞了,虽然并不是完全一样。
结果我ARC E和这道题都没有在赛时做出来/kk。
这里记
赛制最后90s码完了这个方法,结果 WA on pretest 6。赛后发现没开 long long /kk。
为了美观和方便理解,只给出未开 long long 的代码。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<string>
using namespace std;
const int Maxn=3e5+10;
const int Maxm=Maxn<<2;
const int inf=(1ll<<60);
int a[Maxn],b[Maxn];
int f[Maxn],c[Maxn];
int maxv[Maxm],add[Maxm];
int n,ans;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
inline void push_up(int k)
{
maxv[k]=max(maxv[k<<1],maxv[k<<1|1]);
}
inline void upd(int k,int v)
{
add[k]+=v;
maxv[k]+=v;
}
inline void push_down(int k)
{
if(add[k]==0)return;
upd(k<<1,add[k]);
upd(k<<1|1,add[k]);
add[k]=0;
}
void modify_seq(int k,int l,int r,int x,int y,int v)
{
if(x<=l && r<=y)return upd(k,v);
push_down(k);
int mid=(l+r)>>1;
if(x<=mid)modify_seq(k<<1,l,mid,x,y,v);
if(mid<y)modify_seq(k<<1|1,mid+1,r,x,y,v);
push_up(k);
}
void modify(int k,int l,int r,int pos,int v)
{
if(l==r)
{
maxv[k]=v;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)modify(k<<1,l,mid,pos,v);
else modify(k<<1|1,mid+1,r,pos,v);
push_up(k);
}
int query(int k,int l,int r,int x,int y)
{
if(x<=l && r<=y)return maxv[k];
int mid=(l+r)>>1,ret=-inf;
push_down(k);
if(x<=mid)ret=query(k<<1,l,mid,x,y);
if(mid<y)ret=max(ret,query(k<<1|1,mid+1,r,x,y));
return ret;
}
int main()
{
// freopen("in.txt","r",stdin);
n=read();
for(int i=1;i<=n;++i)
a[i]=read();
for(int i=1;i<=n;++i)
b[i]=read();
a[0]=-1;
int cnt=1;
f[1]=0;
for(int i=1;i<=n;++i)
{
while(a[c[cnt]]>=a[i] && cnt)
{
modify_seq(1,0,n,c[cnt-1],c[cnt]-1,-b[c[cnt]]);
--cnt;
}
modify_seq(1,0,n,c[cnt],i-1,b[i]);
f[i]=query(1,0,n,0,i-1);
modify(1,0,n,i,f[i]);
c[++cnt]=i;
}
printf("%lld\n",f[n]);
return 0;
}