比赛 2026.8.28 评测结果 AAAAAAAAAA
题目名称 一周一次买下同班同学的那些事 最终得分 100
用户昵称 郑霁桓 运行时间 0.318 s
代码语言 C++ 内存使用 8.18 MiB
提交时间 2026-08-28 09:42:32
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
long long T,n,a[200005],f[200005][2],g[200005][2];
const long long I=1e18;
vector<int>v;
inline void df(int x,bool y,bool op){
    if(!x) return;
    if(op){
        if(f[x][y]==f[x-1][y]+a[x]){
            df(x-1,y,1);
            return;
        }
        if(y){
            if(f[x][y]==-g[x-1][0]-a[x]){
                if(v.size()&1) v.push_back(x);
                else{
                    int p=v[v.size()-1];
                    v.pop_back();
                    v.push_back(x);
                    v.push_back(p);
                }
                df(x-1,0,0);
                return;
            }
            if(f[x][y]==-g[x-1][1]-a[x]){
                if(v.size()&1) v.push_back(x);
                else{
                    int p=v[v.size()-1];
                    v.pop_back();
                    v.push_back(x);
                    v.push_back(p);
                }
                df(x-1,1,0);
                return;
            }
        }else{
            if(f[x][y]==-g[x-1][0]-a[x]){
                if(v.size()&1){
                    int p=v[v.size()-1];
                    v.pop_back();
                    v.push_back(x);
                    v.push_back(p);
                }else v.push_back(x);
                df(x-1,0,0);
                return;
            }
            if(f[x][y]==-g[x-1][1]-a[x]){
                if(v.size()&1){
                    int p=v[v.size()-1];
                    v.pop_back();
                    v.push_back(x);
                    v.push_back(p);
                }else v.push_back(x);
                df(x-1,1,0);
                return;
            }
        }
    }else{
        if(g[x][y]==g[x-1][y]+a[x]){
            df(x-1,y,0);
            return;
        }
        if(y){
            if(g[x][y]==-f[x-1][0]-a[x]){
                if(v.size()&1) v.push_back(x);
                else{
                    int p=v[v.size()-1];
                    v.pop_back();
                    v.push_back(x);
                    v.push_back(p);
                }
                df(x-1,0,1);
                return;
            }
            if(g[x][y]==-f[x-1][1]-a[x]){
                if(v.size()&1) v.push_back(x);
                else{
                    int p=v[v.size()-1];
                    v.pop_back();
                    v.push_back(x);
                    v.push_back(p);
                }
                df(x-1,1,1);
                return;
            }
        }else{
            if(g[x][y]==-f[x-1][0]-a[x]){
                if(v.size()&1){
                    int p=v[v.size()-1];
                    v.pop_back();
                    v.push_back(x);
                    v.push_back(p);
                }else v.push_back(x);
                df(x-1,0,1);
                return;
            }
            if(g[x][y]==-f[x-1][1]-a[x]){
                if(v.size()&1){
                    int p=v[v.size()-1];
                    v.pop_back();
                    v.push_back(x);
                    v.push_back(p);
                }else v.push_back(x);
                df(x-1,1,1);
                return;
            }
        }
    }
    return;
}
int main(){
    freopen("bought.in","r",stdin);
    freopen("bought.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>T;
//    cout<<T<<"\n"; ///////////
    while(T--){
        cin>>n,v.clear();
//        cout<<n<<'\n'; ///////////
        for(int i=1;i<=n;i++) cin>>a[i];
//        for(int i=1;i<=n;i++) cout<<a[i]<<" "; /////////////
        f[0][0]=g[0][0]=0,f[0][1]=-1e18,g[0][1]=1e18;
        for(int i=1;i<=n;i++){
            f[i][0]=f[i-1][0]+a[i];
            g[i][0]=g[i-1][0]+a[i];
            if(a[i]>0){
                f[i][0]=max(f[i][0],max(-g[i-1][1],-g[i-1][0])-a[i]);
                g[i][0]=min(g[i][0],min(-f[i-1][1],-f[i-1][0])-a[i]);
            }
            f[i][1]=f[i-1][1]+a[i];
            g[i][1]=g[i-1][1]+a[i];
            if(a[i]<0){
                f[i][1]=max(f[i][1],max(-g[i-1][1],-g[i-1][0])-a[i]);
                g[i][1]=min(g[i][1],min(-f[i-1][1],-f[i-1][0])-a[i]);
            }
        }
        df(n,0,1);
//        cout<<f[n][0]<<"\n"; //////////////////
        cout<<v.size()<<"\n";
        for(int i=0;i<v.size();i++) cout<<v[i]<<" ";
        cout<<"\n";
    }
    return 0;
}
//2 -10 -11 3 -10 15 7 18 16 17 -9
//-2 10 11 -3 10 -15
//2 -10 -11
//-2
//-2 -10 -11 -3 -10 -15 7 18 16 17 -9
//2 10 11 3 10 15 -7 18 16 17 -9