QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#153302#6873. King's RuinsczcML 0ms0kbC++142.5kb2023-08-29 21:11:242023-08-29 21:11:25

Judging History

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

  • [2023-08-29 21:11:25]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:0kb
  • [2023-08-29 21:11:24]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int maxn=50005;
struct date{
    int b[5],val,id;
}a[maxn];
inline bool operator == (date x,date y){
    return x.b[0]==y.b[0] && x.b[1]==y.b[1] && x.b[2]==y.b[2] && x.b[3]==y.b[3] && x.b[4]==y.b[4];
}
inline bool operator <= (date x,date y){
    return x.b[0]<=y.b[0] && x.b[1]<=y.b[1] && x.b[2]<=y.b[2] && x.b[3]<=y.b[3] && x.b[4]<=y.b[4];
}
int czc;
inline bool cmp(date x,date y){
    return x.b[czc]>y.b[czc];
}
inline bool cmp2(date x,date y){
    return x.id<y.id;
}
int MX[maxn/14+5][1<<14],f[maxn];
unsigned short pre[maxn][maxn/14+1];
unsigned short can[maxn/14+1];
inline void solve(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=0;j<5;j++)
            cin>>a[i].b[j];
        cin>>a[i].val;
        a[i].id=i;
    }
    int block=14,mx=(n-1)/block+1;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=mx;j++){
            int l=(j-1)*block+1,r=min(j*block,n);
            pre[i][j]=(1<<(r-l+1))-1;
        }
    }
    for(int k=0;k<5;k++){
        czc=k;
        sort(a+1,a+n+1,cmp);
        for(int j=1;j<=mx;j++){
            int l=(j-1)*block+1,r=min(j*block,n);
            can[j]=(1<<(r-l+1))-1;
        }
        for(int i=1,j=1;i<=n;i=j){
            while(a[j]==a[i]){
                for(int k=1;k<=mx;k++){
                    pre[j][k]&=can[k];
                }
                j++;
            }
            j=i;
            while(a[j]==a[i]){
                for(int k=1;k<=mx;k++){
                    int l=(k-1)*block+1,r=min(k*block,n);
                    if(l<=a[j].id && a[j].id<=r){
                        int s=(( 1<<(a[j].id-l) )-1) | ( ~ ( (1<<(a[j].id-l+1)-1) ) );
                        can[k]&=s;
                    }
                }
                j++;
            }
        }

    }
    sort(a+1,a+n+1,cmp2);
    for(int i=1;i<=mx;i++){
        int l=(i-1)*block+1,r=min(i*block,n);
        for(int j=l;j<=r;j++){
            f[j]=a[j].val;
            for(int k=l;k<j;k++)
                if(a[k]<=a[j]) f[j]=max(f[j],f[k]+a[j].val);
            for(int k=1;k<i;k++)
                f[j]=max(f[j],MX[k][pre[j][k]]);
            cout<<f[j]<<endl;
        }
        if(i==n) continue;
        MX[i][0]=0;
        for(int s=1;s<(1<<block);s++)
            MX[i][s]=max(MX[i][s^(s&-s)],f[l+__builtin_ctz(s)]);
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int T;
    cin>>T;
    while(T--){
        solve();
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Memory Limit Exceeded

input:

5
50000
29954 49457 38367 14274 40054 329
30630 36548 13832 4639 22667 5831
30320 36380 15092 40037 34720 1641
14924 15618 6335 10644 6739 3669
12197 42170 43527 35301 9465 7322
14180 40399 20609 10068 44940 3818
6559 16341 18973 46831 15552 7395
14667 37690 12809 49774 22576 7592
11896 6627 17112 3...

output:

329
5831
1641
3669
7322
3818
7395
7592
6690
17239
7847
10337
6491
14257
17239
17239
17239
17239
17239
17239
17239
17239
17829
17239
17239
17239
26675
26327
26675
26675
26675
26675
26675
26675
26675
26675
31698
26675
26675
34781
26675
26675
34781
34781
34781
42450
34781
34781
34781
34781
42486
34781
...

result: