比赛 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;
}