QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#548047#7605. Yet Another Mex Problemsix-floor-slip-liuRE 4ms116868kbC++144.1kb2024-09-05 14:57:032024-09-05 14:57:03

Judging History

你现在查看的是最新测评结果

  • [2024-09-05 14:57:03]
  • 评测
  • 测评结果:RE
  • 用时:4ms
  • 内存:116868kb
  • [2024-09-05 14:57:03]
  • 提交

answer

#include<bits/stdc++.h>
#define forup(i,s,e) for(int i=(s),E123123123=(e);i<=E123123123;++i)
#define fordown(i,s,e) for(int i=(s),E123123123=(e);i>=E123123123;--i)
#define mem(a,b) memset(a,b,sizeof(a))
#ifdef DEBUG
#define msg(args...) fprintf(stderr,args)
#else
#define msg(...) void();
#endif
using namespace std;
using i64=long long;
using i128=__int128;
using pii=pair<int,i64>;
#define fi first
#define se second
#define mkp make_pair
#define gc getchar()
int read(){
    int x=0,f=1;char c;
    while(!isdigit(c=gc)) if(c=='-') f=-1;
    while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc;}
    return x*f;
}
#undef gc
const int N=2e5+5,B=4,T=205;
i64 inf=1e18;
int n,m,a[N];
i64 sum[N];
int L[T],R[T],blg[N];
deque<pii> conv[T];
i128 cross(pii a,pii b){
    return a.fi*b.se-a.se*b.fi;
}
pii operator -(const pii a,const pii b){
    return mkp(a.fi-b.fi,a.se-b.se);
}
bool slp(pii a,pii b,pii c){
    return cross(b-a,c-b)<=0;
}
bool slp(pii a,pii b,i64 k){
    return (b.se-a.se)<(i128)(b.fi-a.fi)*k;
}
i64 dp[N];
int bkt[T][N],mex[T];
bool tag[T];
i64 mxv[T][N];
void work(int pl,int pr,int ql,int qr,int b){
    if(ql>qr) return;
    if(pl==pr){
        forup(i,ql,qr){
            mxv[b][i]=-sum[pl]*i+dp[pl];
        }
        return;
    }
    int mid=(ql+qr)>>1,p=0;
    i64 val=-inf;
    forup(i,pl,pr){
        if(-sum[i]*mid+dp[i]>val){
            p=i;
            val=-sum[i]*mid+dp[i];
        }
    }
    mxv[b][mid]=val;
    work(pl,p,mid+1,qr,b);work(p,pr,ql,mid-1,b);
}
void getconv(int j){
    deque<pii> &q=conv[j];
    q.clear();
    int mm=mex[j+1];
    vector<pii> vv;
    fordown(k,R[j],L[j]){
        while(bkt[j+1][mm]) ++mm;
        pii nw;
        nw.fi=mm;nw.se=mm*sum[k]-dp[k];
        vv.push_back(nw);
        ++bkt[j+1][a[k]];
    }
    forup(k,L[j],R[j]){
        --bkt[j+1][a[k]];
    }
    sort(vv.begin(),vv.end(),[&](pii a,pii b){if(a.fi!=b.fi)return a.fi<b.fi;return a.se>b.se;});
    for(auto i:vv){
        while(q.size()>2&&slp(q[q.size()-2],q[q.size()-1],i)) q.pop_back();
        q.push_back(i);
    }
}
int bb[N],tt[N],m0;
signed main(){
    n=read();m=read();
    forup(i,1,n){
        a[i]=read();
        sum[i]=sum[i-1]+a[i];
    }
    int t=n/B;
    forup(i,1,t){
        L[i]=R[i-1]+1;R[i]=i*B;
        forup(j,L[i],R[i]) blg[j]=i;
    }
    if(R[t]!=n){
        ++t;
        L[t]=R[t-1]+1;R[t]=n;
        forup(j,L[t],R[t]) blg[j]=t;
    }
    forup(i,1,n){
        ++tt[a[i]];
        while(tt[m0]) ++m0;
        dp[i]=0;
        if(i<=m){
            dp[i]=max(dp[i],m0*sum[i]);
        }
        forup(j,1,t) tag[j]=0;
        fordown(j,blg[i],1){
            ++bkt[j][a[i]];
            while(bkt[j][mex[j]]) ++mex[j],tag[j]=1;
        }
        bb[a[i]]=1;
        int mm=0;
        fordown(j,i-1,max(L[blg[i]],i-m)){
            while(bb[mm]) ++mm;
            dp[i]=max(dp[i],dp[j]+mm*(sum[i]-sum[j]));
            bb[a[j]]=1;
        }
        fordown(j,i,max(L[blg[i]],i-m)){
            bb[a[j]]=0;
        }
        fordown(j,blg[i]-1,1){
            if(mex[j]!=mex[j+1]&&(tag[j]||tag[j+1])){
                getconv(j);
            }
        }
        if(i-m>=1&&blg[i]!=blg[i-m]){
            fordown(j,blg[i]-1,blg[i-m]+1){
                if(mex[j]==mex[j+1]){
                    dp[i]=max(dp[i],mex[j]*sum[i]+mxv[j][mex[j]]);
                }else{
                    while(conv[j].size()>=2&&slp(conv[j][0],conv[j][1],sum[i])) conv[j].pop_front();
                    dp[i]=max(dp[i],conv[j].front().fi*sum[i]-conv[j].front().se);
                }
            }
            int mm=mex[blg[i-m]+1],p=blg[i-m]+1;;
            fordown(j,R[blg[i-m]],i-m){
                while(bkt[p][mm]) ++mm;
                dp[i]=max(dp[i],dp[j]+mm*(sum[i]-sum[j]));
                ++bkt[p][a[j]];
            }
            fordown(j,R[blg[i-m]],i-m){
                --bkt[p][a[j]];
            }
        }
        if(i==R[blg[i]]){
            work(L[blg[i]],R[blg[i]],0,n,blg[i]);
            getconv(blg[i]);
        }
    }
    printf("%lld\n",dp[n]);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 16156kb

input:

5 3
3 4 0 0 3

output:

10

result:

ok 1 number(s): "10"

Test #2:

score: 0
Accepted
time: 0ms
memory: 16420kb

input:

8 4
0 1 2 0 3 1 4 1

output:

26

result:

ok 1 number(s): "26"

Test #3:

score: 0
Accepted
time: 3ms
memory: 18288kb

input:

10 5
0 2 0 1 2 1 0 2 2 1

output:

33

result:

ok 1 number(s): "33"

Test #4:

score: 0
Accepted
time: 0ms
memory: 20632kb

input:

20 10
3 1 3 2 3 3 0 1 3 0 2 3 3 3 3 1 3 0 0 3

output:

160

result:

ok 1 number(s): "160"

Test #5:

score: 0
Accepted
time: 0ms
memory: 26420kb

input:

30 10
14 15 10 1 14 1 8 0 12 8 6 15 1 8 9 12 15 10 11 12 7 10 10 3 3 10 8 14 13 13

output:

172

result:

ok 1 number(s): "172"

Test #6:

score: 0
Accepted
time: 0ms
memory: 28764kb

input:

40 3
0 4 2 4 3 1 5 5 2 3 4 2 1 1 1 5 5 4 1 3 3 0 1 0 2 0 1 4 2 1 5 3 0 4 0 0 0 5 3 3

output:

51

result:

ok 1 number(s): "51"

Test #7:

score: 0
Accepted
time: 0ms
memory: 30548kb

input:

50 20
29 6 30 26 8 11 22 26 24 8 30 25 19 12 28 19 28 4 13 9 2 23 30 15 21 5 30 5 19 17 25 29 2 28 20 16 0 4 26 23 22 30 3 25 29 5 29 24 11 27

output:

378

result:

ok 1 number(s): "378"

Test #8:

score: 0
Accepted
time: 0ms
memory: 43224kb

input:

80 15
2 13 20 11 12 10 19 17 3 7 10 2 14 11 9 17 19 11 17 15 10 18 11 11 14 5 20 8 8 12 13 17 14 19 11 20 13 2 12 2 19 12 6 7 3 4 11 16 1 12 4 16 17 4 1 2 5 11 17 12 13 7 8 12 2 4 15 20 18 1 1 13 1 14 6 5 20 12 12 11

output:

0

result:

ok 1 number(s): "0"

Test #9:

score: 0
Accepted
time: 0ms
memory: 51136kb

input:

100 30
41 50 33 22 1 34 7 14 31 44 46 49 49 23 33 12 9 41 25 23 22 1 49 45 45 8 10 49 37 23 48 17 32 44 38 21 29 27 23 27 47 44 6 12 7 2 18 12 9 43 20 26 26 8 14 25 18 48 2 41 49 7 48 38 10 45 34 27 17 12 1 19 9 29 50 13 25 21 9 13 26 15 6 9 5 13 47 30 26 17 40 0 21 6 25 24 22 31 43 16

output:

1308

result:

ok 1 number(s): "1308"

Test #10:

score: 0
Accepted
time: 0ms
memory: 92132kb

input:

200 30
1 26 8 2 6 36 43 49 15 48 39 7 12 18 28 46 13 6 24 17 43 44 31 17 30 5 40 19 13 24 26 1 23 39 34 29 28 2 22 23 32 21 32 5 38 11 18 10 15 14 16 7 40 40 35 30 8 3 46 25 36 50 13 37 16 42 39 9 24 5 8 2 15 17 24 35 39 26 5 24 39 23 47 17 23 49 21 30 36 46 26 15 0 24 23 25 12 16 12 18 42 30 20 0 5...

output:

3389

result:

ok 1 number(s): "3389"

Test #11:

score: 0
Accepted
time: 0ms
memory: 116868kb

input:

300 30
39 28 33 6 10 36 27 31 1 1 9 41 27 39 48 30 43 49 0 11 39 36 15 40 43 28 18 15 17 23 4 9 37 32 5 34 3 4 45 44 18 24 6 23 18 21 40 7 18 38 35 14 5 44 4 10 25 34 14 8 23 43 28 11 22 13 44 16 30 49 40 13 21 32 50 30 29 31 27 35 1 30 10 49 42 33 46 30 47 48 13 5 5 41 22 3 26 26 33 20 34 41 46 27 ...

output:

6636

result:

ok 1 number(s): "6636"

Test #12:

score: 0
Accepted
time: 0ms
memory: 109300kb

input:

400 30
25 30 7 36 38 37 10 15 37 6 4 49 42 34 43 13 46 40 1 6 35 29 50 13 30 23 48 12 43 23 32 44 28 28 1 41 2 31 44 40 5 1 6 17 50 5 40 5 48 36 32 47 20 24 25 42 17 40 8 43 9 10 43 34 30 36 48 48 37 18 21 23 26 20 24 2 44 10 22 46 38 12 50 4 9 17 19 30 6 25 1 20 33 33 21 6 15 11 27 22 2 25 22 30 8 ...

output:

5312

result:

ok 1 number(s): "5312"

Test #13:

score: 0
Accepted
time: 0ms
memory: 109696kb

input:

500 30
11 7 6 40 43 14 47 49 22 9 25 32 6 4 12 48 25 31 2 26 30 46 10 36 43 46 2 34 45 48 11 28 43 22 47 47 1 32 41 36 41 3 31 8 31 14 12 2 2 8 0 30 34 5 46 46 6 20 25 27 46 3 34 8 36 33 27 4 19 10 3 32 33 9 49 24 9 15 18 6 0 20 13 11 28 1 18 30 18 4 12 34 39 50 20 35 30 47 46 24 46 36 49 34 21 10 7...

output:

9118

result:

ok 1 number(s): "9118"

Test #14:

score: 0
Accepted
time: 0ms
memory: 109764kb

input:

600 30
49 8 31 19 46 14 31 32 33 39 20 15 46 25 6 32 2 48 28 20 26 39 44 9 5 43 31 30 23 47 39 10 33 42 44 3 26 7 15 6 28 31 5 2 11 24 11 1 6 6 21 10 25 36 16 26 23 27 19 10 33 47 49 7 43 5 32 37 24 3 9 17 39 49 24 20 50 20 15 18 12 27 3 43 46 36 43 31 28 32 50 50 44 43 19 13 20 6 15 26 14 45 25 11 ...

output:

9497

result:

ok 1 number(s): "9497"

Test #15:

score: 0
Accepted
time: 4ms
memory: 108180kb

input:

700 200
190 11 82 65 81 32 130 4 124 52 155 181 166 29 44 49 187 134 155 130 127 17 76 156 59 155 171 194 110 2 102 122 48 191 31 25 83 154 184 56 38 175 50 190 162 191 116 198 170 173 160 177 184 194 195 64 120 27 154 192 96 160 183 196 76 109 15 81 9 189 120 55 42 17 192 20 100 53 29 197 181 152 1...

output:

142372

result:

ok 1 number(s): "142372"

Test #16:

score: 0
Accepted
time: 0ms
memory: 110776kb

input:

800 200
197 112 65 12 115 42 97 158 105 122 140 175 154 63 192 103 43 87 11 114 164 35 179 101 171 13 104 179 185 78 96 75 93 19 191 108 136 161 152 183 123 199 99 197 147 185 82 112 6 157 178 180 200 47 95 15 153 71 89 172 182 98 187 19 129 126 59 166 2 75 135 86 64 37 58 64 148 195 45 165 125 115 ...

output:

193511

result:

ok 1 number(s): "193511"

Test #17:

score: -100
Runtime Error

input:

900 200
27 187 75 160 123 52 39 137 85 65 149 67 65 122 140 57 101 39 143 200 100 153 57 47 7 172 62 140 34 153 91 4 61 148 51 165 64 92 119 10 183 97 48 2 58 53 48 1 43 117 71 84 115 176 96 192 109 14 124 51 168 137 191 168 182 143 4 50 71 162 75 16 86 158 50 84 120 60 137 158 69 53 32 24 59 94 178...

output:


result: