code
#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