code
unknown
plain_text
10 months ago
3.7 kB
5
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();
}
}Editor is loading...
Leave a Comment