| 比赛 |
2026.8.28 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
一周一次买下同班同学的那些事 |
最终得分 |
100 |
| 用户昵称 |
zcx |
运行时间 |
0.316 s |
| 代码语言 |
C++ |
内存使用 |
8.56 MiB |
| 提交时间 |
2026-08-28 10:20:20 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 2e5 + 5;
const int INF = 1e18;
int n,d,k;
int a[N],ans[N],pp[N];
int f[3][N],vis[3][N];
int pre[3][N];
void add(int x,int op){
if(!d){
d = x;k++;
return;
}
if((k & 1) == (op & 1)) ans[k] = x;
else ans[k] = d,d = x;
k++;
}
int get(){
if(f[0][1] >= f[1][1] && f[0][1] >= f[2][1]) return 0;
if(f[1][1] >= f[0][1] && f[1][1] >= f[2][1]) return 1;
return 2;
}
signed main()
{
freopen("bought.in","r",stdin);
freopen("bought.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
int T;cin>>T;
while(T--){
cin>>n;d = 0;k = 0;
for(int i = 1;i <= n;i++) cin>>a[i];
f[0][n + 1] = 0;f[1][n + 1] = f[2][n + 1] = -INF;
for(int i = n;i >= 1;i--){
f[0][i] = f[0][i + 1] + a[i];pre[0][i] = 0;
f[1][i] = f[1][i + 1] - a[i];pre[1][i] = 1;
f[2][i] = f[2][i + 1] + a[i];pre[2][i] = 2;
if(a[i] > 0 && f[0][i + 1] - a[i] > f[1][i]) f[1][i] = f[0][i + 1] - a[i],pre[1][i] = 0,vis[1][i] = 1;
if(f[2][i + 1] - a[i] > f[1][i]) f[1][i] = f[2][i + 1] - a[i],pre[1][i] = 2,vis[1][i] = 1;
if(f[1][i + 1] + a[i] > f[2][i]) f[2][i] = f[1][i + 1] + a[i],pre[2][i] = 1,vis[2][i] = 1;
}
int p = get();
for(int i = 1;i <= n;i++) pp[i] = p,p = pre[p][i];
for(int i = n;i >= 1;i--) if(vis[pp[i]][i]) add(i,(a[i] > 0 ? 1 : 0));
if(d) ans[k] = d;
cout<<k<<'\n';
for(int i = 1;i <= k;i++) cout<<ans[i]<<' ';
cout<<'\n';
for(int i = 1;i <= n;i++) ans[i] = 0,vis[1][i] = vis[2][i] = vis[0][i] = 0;
}
return 0;
}