Submission #1300239

#TimeUsernameProblemLanguageResultExecution timeMemory
1300239danglayloi1Feast (NOI19_feast)C++20
100 / 100
169 ms115360 KiB
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=3e5+5;
int n, k, a[nx];
struct dak
{
    ll sum, pre, suf, res;
    int pl, pr;
    ii pos;
    dak()
    {
        sum=0;
        pre=suf=res=-inf;
        pl=pr=-1;
        pos={-1, -1};
    }
} nod[nx<<2], st[nx<<2];
dak operator +(dak a, dak b)
{
    dak c;
    c.sum=a.sum+b.sum;
    if(a.pre>a.sum+b.pre) c.pre=a.pre, c.pl=a.pl;
    else c.pre=a.sum+b.pre, c.pl=b.pl;
    if(b.suf>b.sum+a.suf) c.suf=b.suf, c.pr=b.pr;
    else c.suf=b.sum+a.suf, c.pr=a.pr;
    c.res=max(max(a.res, b.res), a.suf+b.pre);
    if(a.res==c.res) c.pos=a.pos;
    else if(b.res==c.res) c.pos=b.pos;
    else c.pos={a.pr, b.pl};
    return c;
}
bool la[nx<<2];
void build(int id, int l, int r)
{
    la[id]=0;
    if(l==r)
    {
        nod[id].sum=nod[id].pre=nod[id].suf=nod[id].res=a[l];
        nod[id].pl=nod[id].pr=l;
        nod[id].pos={l, l};
        st[id].sum=st[id].pre=st[id].suf=st[id].res=-a[l];
        st[id].pl=st[id].pr=l;
        st[id].pos={l, l};
        return;
    }
    int mid=(l+r)>>1;
    build(id<<1, l, mid);
    build(id<<1|1, mid+1, r);
    nod[id]=nod[id<<1]+nod[id<<1|1];
    st[id]=st[id<<1]+st[id<<1|1];
}
void apply(int id)
{
    la[id]^=1;
    swap(st[id], nod[id]);
}
void down(int id)
{
    if(!la[id]) return;
    apply(id<<1);
    apply(id<<1|1);
    la[id]=0;
}
void update(int id, int l, int r, int u, int v)
{
    if(l>v || r<u) return;
    if(l>=u && r<=v) return void(apply(id));
    int mid=(l+r)>>1;
    down(id);
    update(id<<1, l, mid, u, v);
    update(id<<1|1, mid+1, r, u, v);
    nod[id]=nod[id<<1]+nod[id<<1|1];
    st[id]=st[id<<1]+st[id<<1|1];
}
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>n>>k;
    for(int i = 1; i <= n; i++)
        cin>>a[i];
    build(1, 1, n);
    ll ans=0, cur=0;
    for(int te = 0; te < k; te++)
    {
        cur+=nod[1].res;
        ans=max(ans, cur);
        ii p=nod[1].pos;
        update(1, 1, n, p.fi, p.se);
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...