QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#888051 | #9920. Money Game 2 | ucup-team5008 | WA | 1ms | 3712kb | C++23 | 2.6kb | 2025-02-07 21:44:41 | 2025-02-07 21:44:44 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define rep2(i,j,k) for(ll i=ll(j);i<ll(k);i++)
#define rep(i,j) rep2(i,0,j)
#define rrep2(i,j,k) for(ll i=ll(j)-1;i>=ll(k);i--)
#define rrep(i,j) rrep2(i,j,0)
#define SZ(a) ll(a.size())
#define eb emplace_back
#define all(a) a.begin(),a.end()
using ll=long long;
using vl=vector<ll>;
using vvl=vector<vl>;
using P=pair<ll,ll>;
using vp=vector<P>;
using vvp=vector<vp>;
const ll inf=LLONG_MAX/4;
template<class T>
bool chmin(T& a,T b){return a>b?a=b,1:0;}
template<class T>
bool chmax(T& a,T b){return a<b?a=b,1:0;}
void print(vl v){for(auto el:v) cout<<el<<" ";cout<<"\n";}
void solve(){
ll n;cin>>n;
vl a(n);
rep(i,n) cin>>a[i];
if(n<=1000){
vl ans(n,-inf);
rep(i,n){
vl add=a;
ll now;
now=i;
ll carry=0;
do{
add[now]+=carry;
carry+=a[now];
carry/=2;
now=(now+1)%n;
}while(now!=i);
chmax(ans[i], a[i]+carry);
now=(i+n-1)%n;
carry=0;
do{
add[now]+=carry;
carry+=a[now];
carry/=2;
now=(now+n-1)%n;
}while(now!=(i+n-1)%n);
chmax(ans[(i+n-1)%n],a[(i+n-1)%n]+carry);
rep(j,n) chmax(ans[j],add[j]);
}
print(ans);
return;
}
const ll M=40;
vvl table(2,vl(n,-inf));
vvl las(2,vl(n,-inf));
vvl value(2,vl(n));
rep(i,2){
auto mem=a;
rep(j,n) a.eb(a[j]);
vvl sum(2*n,vl(M));
vl last(2*n);
rep(j,2*n){
rep(k,M){
if(j>=k) sum[j][k]=(a[j-k]>>(k+1));
}
rep(k,M-1) sum[j][k+1]+=sum[j][k];
last[j]=j;
rrep(k,M-1){
if(sum[j][k+1]!=sum[j][k]){
last[j]=j-k;
break;
}
}
}
vl ok(2*n,-inf);
rep(j,2*n){
if(a[j%n]/2%2==0) continue;
rep2(k,1,M){
if(j+k>=2*n) break;
if(a[(j+k)%n]%2==0) break;
if(j+k>=n&&k) chmax(table[i][(j+k)-n],j-n);
if(k==M-1) chmax(ok[j+k],j);
}
}
rep2(j,n,2*n){
value[i][j-n]=sum[j][M-1];
}
las[i]=last;
rep(j,2*n-1) if(a[(j+1)%n]%2) chmax(ok[j+1],ok[j]);
rep2(j,n,2*n) chmax(table[i][j-n],ok[j]-n);
rep(j,n) table[i][j]=j-table[i][j]+1;
rep(j,n) las[i][j]=j-las[i][j]+1;
a=mem;
reverse(all(a));
}
// reverse(all(table[1]));
// reverse(all(las[1]));
// reverse(all(value[1]));
vl ans(n);
rep(i,n){
ll l=(i+n-1)%n;
ll r=(i+1)%n;
r=n-1-r;
ll left=table[0][l];
ll right=table[1][r];
ans[i]=a[i]+value[0][l]+value[1][r];
// cout<<left<<" "<<right<<" "<<las[0][l]<<" "<<las[1][r]<<endl;
if(left+las[1][r]<=n-1){
if(left+right<=n-1) ans[i]+=2;
else ans[i]++;
}
else if(right+las[0][l]<=n-1) ans[i]++;
}
print(ans);
return;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
ll t;cin>>t;
while(t--) solve();
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 3712kb
input:
3 5 2 1 4 3 5 5 2 1 3 1 2 1 1000000000
output:
6 5 7 8 8 4 4 5 4 4 1500000000
result:
wrong answer 11th numbers differ - expected: '1000000000', found: '1500000000'