QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#847210 | #9920. Money Game 2 | jaker | WA | 41ms | 23284kb | C++20 | 2.9kb | 2025-01-07 18:59:03 | 2025-01-07 18:59:07 |
Judging History
answer
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
using namespace std;
template<class T> using Arr = std::vector<T>;
typedef long long LL;
const int MAXN = 500002;
const int THRE = 120;
int n;
int a[MAXN*2];
#define REG(x)(((x)-1) % n + 1)
int bit[MAXN*2];
LL val[MAXN*2];
pair<LL,int> left_ans[MAXN*2],right_ans[MAXN*2];
LL ans1[MAXN*2],ans2[MAXN*2];
void BruteF() {
static LL f[THRE+10][2*THRE+10];
static LL g[THRE+10][2*THRE+10];
for(int i = 1;i <= n;++i)
for(int j = 1;j <= 2*n;++j)
g[i][j] = f[i][j] = 0;
for(int i = 1;i <= n;++i) {
f[i][i] = 0;
for(int j = i+1; j <= i+n-1;++j)
f[i][j] = ( f[i][j-1] + a[REG(j-1)] ) / 2;
g[i][n+i] = 0;
for(int j = n+i-1; j > i; --j)
g[i][j] = ( g[i][j+1] + a[REG(j+1)] ) / 2;
}
for(int i = 1;i <= n;++i) {
LL ans = 0;
for(int j = 1; j <= n; ++j)
ans = std::max( ans , f[j%n+1][i] + f[j%n+1][n+i] + g[j][i] + g[j][n+i] );
ans1[i] = ans + a[i];
cout << ans1[i] << " ";
}
cout << endl;
}
void solve() {
cin >> n;
for(int i = 1;i <= n;++i) {
cin >> a[i];
a[i+n] = a[i];
}
if( n < THRE )
return BruteF();
LL nxt;
for(int i = 1;i <= 2*n;++i) {
int p = i;
LL now = a[p];
for(; p >= 1 && now; --p) {
if( now > 0 && p != i )
right_ans[p] = make_pair( val[p+1] , i );
val[p] += (now + bit[p])/2;
nxt = (nxt+bit[p])/2;
if( now&1 && bit[p] ) bit[p] = 0;
else if( !bit[p] && now&1 ) bit[p] = 1;
now = nxt;
}
}
for(int i = 1;i <= 2*n;++i) val[i] = bit[i] = 0;
for(int i = 2*n;i >= 1;--i) {
int p = i;
LL now = a[p];
for(; p <= 2*n && now;++p) {
if( now > 0 && p != i )
left_ans[p] = make_pair( val[p-1] , i );
val[p] += ( now + bit[p] ) / 2;
nxt = ( nxt + bit[p] ) / 2;
if( now&1 && bit[p] ) bit[p] = 0;
else if( !bit[p] && now&1 ) bit[p] = 1;
now = nxt;
}
}
for(int i = 1;i <= n;++i) {
LL ans = right_ans[i].first + left_ans[i+n].first + a[i];
int pos1 = right_ans[i].second,
pos2 = left_ans[i].second;
if( pos1 > n ) pos1 -= n;
if( pos2 > n ) pos2 -= n;
if( pos1 > i && pos2 < i );
else if( pos1 > i ) {
if( pos1 < pos2 );
else --ans;
}
else {
if( pos1 < pos2 );
else --ans;
}
cout << ans << " ";
}
cout << endl;
}
int main() {
ios::sync_with_stdio(false);
int T;
cin >> T;
while(T--)
solve();
return 0 ;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 7776kb
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 1000000000
result:
ok 11 numbers
Test #2:
score: 0
Accepted
time: 1ms
memory: 9828kb
input:
1 10 8 15 18 15 13 4 14 4 17 5
output:
30 37 41 39 34 27 29 26 31 27
result:
ok 10 numbers
Test #3:
score: 0
Accepted
time: 2ms
memory: 7716kb
input:
1000 4 8 9 7 9 1 9 1 10 2 3 9 3 4 3 2 4 0 4 3 1 4 10 8 4 6 1 9 1 4 4 10 10 1 6 1 9 1 0 2 4 6 4 8 1 6 7 2 5 10 4 9 2 1 4 3 5 5 9 3 9 8 9 4 4 8 5 6 2 10 1 1 7 3 9 2 4 4 2 4 1 2 3 5 2 1 1 4 3 2 0 9 4 7 3 10 1 3 4 1 2 2 6 4 1 2 3 3 1 5 3 5 8 4 2 9 3 4 5 9 10 3 4 6 5 4 0 1 6 4 3 1 10 1 4 1 9 5 7 4 8 1 6 ...
output:
18 18 17 18 9 10 7 10 6 6 5 3 5 5 3 18 16 13 15 9 4 18 17 11 14 9 0 7 8 13 9 11 14 10 12 12 7 6 9 11 11 13 17 16 17 12 14 13 12 10 6 7 12 8 9 5 6 4 4 6 4 4 4 6 5 10 11 11 13 10 5 4 4 8 7 2 5 4 6 11 12 10 10 7 13 17 16 12 9 10 8 6 6 6 7 11 7 9 13 12 11 14 10 12 1...
result:
ok 2420 numbers
Test #4:
score: 0
Accepted
time: 2ms
memory: 7724kb
input:
1000 2 45733740 736448710 1 384264719 4 658671808 379716865 553196572 534986092 1 668964623 4 711670857 237459905 849354895 187613938 2 394629064 371184128 2 616819808 937720703 1 43217931 3 934395080 888433507 810476236 1 587663687 2 542163302 508453558 4 313836277 584869499 445629251 225398284 4 2...
output:
413958095 759315580 384264719 1254322429 1119397578 1175216002 1235849498 668964623 1136546502 1064876265 1239809530 1027491789 580221128 568498660 1085680159 1246130607 43217931 1783849951 1760869165 1721890529 587663687 796390081 779535209 830377481 1020951833 929222211 751348422 70477...
result:
ok 2440 numbers
Test #5:
score: -100
Wrong Answer
time: 41ms
memory: 23284kb
input:
1 500000 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1...
output:
3125174507338 378631160815 23297589896 722384058 11243248 87668 343 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...
result:
wrong answer 1st numbers differ - expected: '4', found: '3125174507338'