code

 avatar
unknown
plain_text
2 months ago
3.7 kB
3
Indexable
#include<bits/stdc++.h>
using namespace std;

#define int long long
#define endl "\n"

bool TestCases = true;

void solve()
{
    int n;
    cin>>n;
    vector<int> vec(n);
    for(int i=0;i<n;i++) {
        cin>>vec[i];
    }
    int num = vec[0];
    int index = 0;
    bool smt = false;
    //checking if there's an index which is different
    for(int i=0;i<n;i++) {
        if(vec[i]!=1 && vec[i]!=-1) {
            num = vec[i];
            index = i;
            smt = true;
            break;
        }
    }
    //if there's a different number present
    if(smt) {
        int leftmini = 0;
        int leftmaxi = 0;
        int rightmini = 0;
        int rightmaxi = 0;
        int sum = 0;
        //checking the minimum and maximum possible answers for the left side of the index
        for(int i=0;i<index;i++) {
            sum+=vec[i];
            leftmini = min(leftmini,sum);
            if(sum>0) {
                sum = 0;
            }
        }
        sum = 0;
        for(int i=0;i<index;i++) {
            sum+=vec[i];
            leftmaxi = max(leftmaxi,sum);
            if(sum<0) {
                sum = 0;
            }
        }
        //checking the minimum and maximum possible answers for the right side of the index
        sum = 0;
        for(int i=index+1;i<n;i++) {
            sum+=vec[i];
            rightmini = min(rightmini,sum);
            if(sum>0) {
                sum = 0;
            }
        }
        sum = 0;
        for(int i=index+1;i<n;i++) {
            sum+=vec[i];
            rightmaxi = max(rightmaxi,sum);
            if(sum<0) {
                sum = 0;
            }
        }
        set<int> st;
        //inserting the elements from leftmin to leftmax and rightmin to rightmax
        for(int i=leftmini;i<=leftmaxi;i++) {
            st.insert(i);
        }
        for(int i=rightmini;i<=rightmaxi;i++) {
            st.insert(i);
        }
        //taking a continuous subarray from index-1 to 0 and another subarray from index+1 to n-1
        //and calculating their minimum and maximum possible values
        int smtleftmini = 0;
        int smtleftmaxi = 0;
        int smtrightmini = 0;
        int smtrightmaxi = 0;
        sum = 0;
        for(int i=index-1;i>=0;i--) {
            sum+=vec[i];
            smtleftmini = min(smtleftmini,sum);
            smtleftmaxi = max(smtleftmaxi,sum);

        }
        sum = 0;
        for(int i=index+1;i<n;i++) {
            sum+=vec[i];
            smtrightmini = min(smtrightmini,sum);
            smtrightmaxi = max(smtrightmaxi,sum);

        }
        //looping from lowest possible value from left and right side to highest possible value from left and right
        for(int i=smtleftmini+smtrightmini+num;i<=smtleftmaxi+smtrightmaxi+num;i++) {
            st.insert(i);
        }
        cout<<st.size()<<endl;
        for(int i : st) {
            cout<<i<<" ";
        }
        cout<<endl;
    }else{
        //if there are just -1 and 1 
        int mini = 0;
        int maxi = 0;
        int sum = 0;
        for(int i=0;i<n;i++) {
            sum+=vec[i];
            mini = min(mini,sum);
            if(sum>0) {
                sum = 0;
            }
        }
        sum = 0;
        for(int i=0;i<n;i++) {
            sum+=vec[i];
            maxi = max(maxi,sum);
            if(sum<0) {
                sum = 0;
            }
        }
        cout<<maxi-mini+1<<endl;
        for(int i=mini;i<=maxi;i++) {
            cout<<i<<" ";
        }
        cout<<endl;
    }

}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int t = 1;
    if(TestCases)
    {
        cin >> t;
    }

    while(t--)
    {
        solve();
    }
}
Leave a Comment