QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#866920#9920. Money Game 2ucup-team073ML 0ms0kbC++232.7kb2025-01-22 21:52:302025-01-22 21:52:32

Judging History

This is the latest submission verdict.

  • [2025-01-22 21:52:32]
  • Judged
  • Verdict: ML
  • Time: 0ms
  • Memory: 0kb
  • [2025-01-22 21:52:30]
  • Submitted

answer

#pragma GCC optimize(2)
#pragma GCC optimize(3)

#include <bits/stdc++.h>
// #define int long long
#define pii pair<int,int>
#define pb push_back
#define st first
#define nd second
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar())f^=ch=='-';
    for(;isdigit(ch);ch=getchar())x=x*10+(ch^48);
    return f?x:-x;
}
void write(int x){
    if(x<0)putchar('-'),x=-x;
    write(x/10),putchar('0'+x%10);
}
const int N=5e5+5,LOG=22;
int a[N<<1],n;
pii L[N<<1][LOG],R[N<<1][LOG];
int calc(vector<int> arr){
    for(int i=arr.size()-1;i>=1;--i)
        arr[i-1]+=arr[i]/2;
    return arr[0]/2;
}
void solve(){
    n=read();
    for(int i=1;i<=n;++i)a[i]=a[i+n]=read();
    for(int i=n*2;i>=1;--i){
        vector<int> tmp;
        L[i][0]={0,i};
        for(int x=1;x+1<LOG;++x){
            if(i+x<=n*2){
                tmp.pb(a[i+x]);
                L[i][x]={calc(tmp),i+x};
            }else L[i][x]={-1,-1};
        }
        int pos=i+LOG-1;
        if(pos<=n*2){
            tmp.pb(a[pos]);
            int val=-1,FIND=-1;
            for(int j=0;j<LOG;++j){
                if(L[pos][j].st==-1)break;
                tmp[tmp.size()-1]=a[pos]+L[pos][j].st;
                val=calc(tmp);
                if(val>L[i][LOG-2].st){
                    FIND=L[pos][j].nd;
                    break;
                }
            }
            if(FIND==-1)L[i][LOG-1]={-1,-1};
            else L[i][LOG-1]={val,FIND};
        }else L[i][LOG-1]={-1,-1};
    }
    for(int i=1;i<=n*2;++i){
        vector<int> tmp;
        R[i][0]={0,i};
        for(int x=1;x+1<LOG;++x){
            if(i-x>=1){
                tmp.pb(a[i-x]);
                R[i][x]={calc(tmp),i-x};
            }else R[i][x]={-1,-1};
        }
        int pos=i-LOG+1;
        if(pos>=1){
            tmp.pb(a[pos]);
            int val=-1,FIND=-1;
            for(int j=0;j<LOG;++j){
                if(R[pos][j].st==-1)break;
                tmp[tmp.size()-1]=a[pos]+R[pos][j].st;
                val=calc(tmp);
                if(val>R[i][LOG-2].st){
                    FIND=R[pos][j].nd;
                    break;
                }
            }
            if(FIND==-1)R[i][LOG-1]={-1,-1};
            else R[i][LOG-1]={val,FIND};
        }else R[i][LOG-1]={-1,-1};
    }
    for(int i=1;i<=n;++i){
        int ans=0;
        for(int x=0;x<LOG;++x)for(int y=0;y<LOG;++y){
            if(L[i][x].nd>=R[i+n][y].nd)continue;
            if(L[i][x].st==-1||R[i+n][y].st==-1)continue;
            ans=max(ans,a[i]+L[i][x].st+R[i+n][y].st);
        }
        write(ans),putchar(' ');
    }
    puts("");
}
signed main(){
    for(int cas=read();cas--;)solve();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Memory Limit Exceeded

input:

3
5
2 1 4 3 5
5
2 1 3 1 2
1
1000000000

output:


result: