C. Odd Process

Revision en2, by wqy_03, 2025-12-13 14:42:39
#include<bits/stdc++.h>
using namespace std;
#define int long long
int T;
signed main(){
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        vector<int> odd,even;
        int maxn=0;
        for(int i=1;i<=n;i++){
            int x;
            cin>>x;
            if(x%2==1)
            {
                maxn=max(maxn,x);
                odd.push_back(x);
            }
            else even.push_back(x);
        }
        sort(odd.begin(),odd.end(),greater<int>());
        sort(even.begin(),even.end(),greater<int>());
        vector<int> sum(even.size()+10,0);
        for(int i=1;i<=(int)even.size();i++){
            sum[i]=sum[i-1]+even[i-1];
        }
        if(odd.size()==0){
            for(int i=1;i<=n;i++){
                cout<<0<<" ";
            }
            cout<<endl;
            continue;
        }
        for(int k=1;k<=n;k++){
            int r=min((int)even.size(),k-1);
            if(r<0)
            {
                cout<<0<<" ";
                continue;
            }
            int last=k-1-r;
            int ans=0,ok=0;
            if(last%2==0){
                if(last<=(int)odd.size()-1){
                    ans=maxn+sum[r];
                    ok=1;
                }
            }
            else{
                if(r<=(int)even.size()-1 && last<=(int)odd.size()){
                    ans=maxn+sum[r];
                    ok=1;
                }
            }
            if(ok){
                cout<<ans<<" ";
            }
            else{
                    r-=1;
                    if(r<0){
                        cout<<0<<" ";
                        continue;
                    }
                    last=k-1-r;
                    if(last%2==0){
                        if(last<=(int)odd.size()-1){
                            ans=maxn+sum[r];
                            ok=1;
                        }
                    }
                    else{
                        if(r<=(int)even.size()-1 && last<=(int)odd.size()){
                            ans=maxn+sum[r];
                            ok=1;
                        }
                    }
                cout<<ans<<" ";    
            }
        }
        cout<<endl;
    }
    return 0;
}

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en2 English wqy_03 2025-12-13 14:42:39 24
en1 English wqy_03 2025-12-13 14:41:42 2330 Initial revision (published)