# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
696783 | vjudge1 | Holiday (IOI14_holiday) | C++17 | 0 ms | 0 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100010;
int n,m,st,d,cnt,rt[N],a[N];
ll f[5][N*3];
vector<int>h;
struct node{ll sum;int cnt,l,r;}t[32*N];
void insert(int las,int &x,int l,int r,int X)
{
x=++cnt;t[x]=t[las];
if(l==r)return t[x].sum+=h[X-1],t[x].cnt++,void();
int mid=(l+r)>>1;
if(X<=mid)insert(t[las].l,t[x].l,l,mid,X);
else insert(t[las].r,t[x].r,mid+1,r,X);
t[x].sum=t[t[x].l].sum+t[t[x].r].sum;
t[x].cnt=t[t[x].l].cnt+t[t[x].r].cnt;
}
ll query(int ls,int rs,int l,int r,int res)
{
if(res<0)return -1e18;
if(l==r)return 1ll*h[l-1]*min(res,t[rs].cnt-t[ls].cnt);
int mid=(l+r)>>1;
if(t[t[rs].r].cnt-t[t[ls].r].cnt>=res)
return query(t[ls].r,t[rs].r,mid+1,r,res);
return t[t[rs].r].sum-t[t[ls].r].sum+
query(t[ls].l,t[rs].l,l,mid,res-t[t[rs].r].cnt+t[t[ls].r].cnt);
}
void solve(int T,int l,int r,int L,int R)
{
// cout<<T<<' '<<l<<' '<<r<<' '<<L<<' '<<R<<endl;
if(l>r||L>R)return;
if(l==r)
{
for(int i=L;i<=R;i++)
if(T<3)f[T][i]=query(rt[min(st,l)-1],rt[max(st,l)],1,m,i-(2-T%2)*abs(st-l));
else f[T][i]=query(rt[min(st-1,l)-1],rt[max(st-1,l)],1,m,i-(2-T%2)*abs(st-l));
return;
}
int M=(L+R)>>1,pos=-1;f[T][M]=-1e18-1;
ll now;
if(T<3)
for(int i=l;i<=r;i++)
{
now=query(rt[min(st,i)-1],rt[max(st,i)],1,m,M-(2-T%2)*abs(st-i));
if(now>=f[T][M])f[T][M]=now,pos=i;
}
else
for(int i=r;i>=l;i--)
{
// if(T==4&&l==1&&r==30123)printf("[%d,%d],%d\n",min(st-1,i)-1,max(st-1,i),M-(2-T%2)*abs(st-i));
now=query(rt[min(st-1,i)-1],rt[max(st-1,i)],1,m,M-(2-T%2)*abs(st-i));
if(now>=f[T][M])f[T][M]=now,pos=i;
}
if(T<3)solve(T,l,pos,L,M-1),solve(T,pos,r,M+1,R);
else solve(T,l,pos,M+1,R),solve(T,pos,r,L,M-1);
}
signed main()
{
// freopen("3.out","r",stdin);
// freopen("1.out","w",stdout);
scanf("%d%d%d",&n,&st,&d);st++;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),h.push_back(a[i]);
sort(h.begin(),h.end());
h.erase(unique(h.begin(),h.end()),h.end());
m=h.size();
for(int i=1;i<=n;i++)
a[i]=lower_bound(h.begin(),h.end(),a[i])-h.begin()+1,
insert(rt[i-1],rt[i],1,m,a[i]);
solve(1,st,n,1,d);solve(2,st,n,1,d);
solve(3,1,st-1,1,d);solve(4,1,st-1,1,d);
ll ans=0;
for(int i=0;i<=d;i++)
ans=max(ans,max(f[1][i]+f[4][d-i],f[2][i]+f[3][d-i]));
printf("%lld\n",ans);
// printf("%d\n",ppcnt);
}