QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#358547#6194. Knapsack ProblemschrodingerstomTL 21ms4992kbC++143.8kb2024-03-19 20:59:312024-03-19 20:59:31

Judging History

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

  • [2024-03-19 20:59:31]
  • 评测
  • 测评结果:TL
  • 用时:21ms
  • 内存:4992kb
  • [2024-03-19 20:59:31]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
bool memBeg;
template<typename T> void chkmin(T &x,T y) {if(x>y) x=y;}
template<typename T> void chkmax(T &x,T y) {if(x<y) x=y;}
constexpr int mod=1e9+7;
void inc(int &x,int y) {x+=y; x-=(x>=mod)*mod;}
void dec(int &x,int y) {x-=y; x+=(x<0)*mod;}
constexpr int add(int x,int y) {return (x+y>=mod)?x+y-mod:x+y;}
constexpr int sub(int x,int y) {return (x<y)?x-y+mod:x-y;}
constexpr int quick_pow(int x,int times) {
    int ret=1;
    for(;times;times>>=1,x=1ll*x*x%mod) {
        if(times&1) ret=1ll*ret*x%mod;
    }
    return ret;
}
constexpr int D=30;
constexpr int maxn=25;
constexpr int maxK=10;
constexpr int maxmask1=5005;
constexpr int maxmask2=6.6e4+5;
constexpr ll INF=0x3f3f3f3f3f3f3f3f;
int K,pK,c[maxn],a[maxK];
// int trans1[maxn][maxmask2];
int vld[maxmask2],top;
ll maxx[maxmask2],nmaxx[maxmask2];
void mian() {
    scanf("%d",&K);
    for(int i=1;i<(1<<K);i++) scanf("%d",&c[i]);
    for(int i=0;i<K;i++) scanf("%d",&a[i]);
    int full1=1,full2=1;
    for(int i=0;i<K;i++) {
        full1<<=(K-1); full2<<=K;
    }
    fill(maxx,maxx+full1,-INF);
    maxx[0]=0ll;
    top=0;
    for(int i=0;i<full2;i++) {
        vld[top++]=i;
        for(int j=0;j<K;j++) {
            if(((i>>(j*K))&((1<<K)-1))>9) {
                top--; break;
            }
        }
    }
    // if(pK!=K) {
    //     for(int j=1;j<(1<<K);j++) {
    //         for(int k=0;k<full2;k++) {
    //             int nk=k;
    //             for(int t=0;t<K;t++) {
    //                 if(j&(1<<t)) {
    //                     if((nk>>(t*K))&((1<<K)-1)) nk-=1<<(t*K);
    //                     else {nk=-1; break;}
    //                 }
    //             }
    //             trans1[j][k]=nk;
    //         }
    //     }
    //     pK=K;
    // }
    for(int i=D-1;i>=0;i--) {
        fill(maxx+full1,maxx+full2,-INF);
        for(int j=full1-1;j>=0;j--) {
            ll now=maxx[j]; maxx[j]=-INF;
            if(now<0) continue;
            int nj=0,pj=j;
            for(int k=0;k<K;k++) {
                nj=((pj&((1<<(K-1))-1))<<1|((a[k]>>i)&1))<<(k*K)|nj;
                if(((pj&((1<<(K-1))-1))<<1|((a[k]>>i)&1))>9) {
                    nj=-1; break;
                }
                pj>>=(K-1);
            }
            if(nj!=-1) maxx[nj]=now;
        }
        for(int j=1;j<(1<<K);j++) {
            fill(nmaxx,nmaxx+full2,-INF);
            for(int kk=0;kk<top;kk++) {
                int k=vld[kk];
                if(maxx[k]<0) continue;
                chkmax(nmaxx[k],maxx[k]);
                // int nk=trans1[j][k];
                int nk=k;
                for(int t=0;t<K;t++) {
                    if(j&(1<<t)) {
                        if((nk>>(t*K))&((1<<K)-1)) nk-=1<<(t*K);
                        else {nk=-1; break;}
                    }
                }
                if(nk!=-1) chkmax(nmaxx[nk],maxx[k]+(((ll)c[j])<<i));
            }
            memcpy(maxx,nmaxx,sizeof(ll)*full2);
        }
        fill(nmaxx,nmaxx+full1,-INF);
        for(int jj=0;jj<top;jj++) {
            int j=vld[jj],nj=0;
            for(int t=K-1;t>=0;t--) {
                int cur=(j>>(t*K))&((1<<K)-1);
                if(cur>=(1<<(K-1))) {nj=-1; break;}
                nj=nj<<(K-1)|cur;
            }
            if(nj!=-1) chkmax(nmaxx[nj],maxx[j]);
        }
        memcpy(maxx,nmaxx,sizeof(ll)*full1);
    }
    printf("%lld\n",max(-1ll,maxx[0]));
}
bool memEn;
void fl() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}
int main() {
    fprintf(stderr,"%.24lf\n",fabs(&memEn-&memBeg)/1024.0/1024.0);
    // fl();
    int _; scanf("%d",&_);
    while(_--) mian();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 21ms
memory: 4992kb

input:

3
2
1 2 4
4 5
3
3226252 19270256 2430652 1187613 12496062 10286165 17494834
24 85 34
4
901133 6693218 13245489 14740234 16186210 11382783 19277321 3855635 16523184 10168517 16195031 971041 10303441 8395899 11618555
529321239 218214127 92942310 207467810

output:

18
1949753378
7832404777567179

result:

ok 3 number(s): "18 1949753378 7832404777567179"

Test #2:

score: -100
Time Limit Exceeded

input:

100
4
4488409 9842893 14331290 11289097 15777479 21131954 25620334 6146092 10634508 15988956 20477387 17435190 21923584 27278027 31766493
200477197 258791439 590664017 982949628
4
5484152 19851747 25335961 6555937 12039831 26407861 31891996 10897184 16381166 30749333 36233145 17453055 22937114 37304...

output:

16156444320083421
24565535429631234
29418802996321901
30685727712782520
21026118053726857
27272339796311010
28831028447377015
34577176834491128
9058894962996375
21525085254465501
6657186892229297
16750628911275484
11217846865301187
12674726744043780
33873234230125448
3890237279573366
319038768614465...

result: