QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#866920 | #9920. Money Game 2 | ucup-team073 | ML | 0ms | 0kb | C++23 | 2.7kb | 2025-01-22 21:52:30 | 2025-01-22 21:52:32 |
Judging History
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();
}
详细
Test #1:
score: 0
Memory Limit Exceeded
input:
3 5 2 1 4 3 5 5 2 1 3 1 2 1 1000000000