Pagini recente » Cod sursa (job #1924701) | Cod sursa (job #1580652) | Cod sursa (job #2499620) | Cod sursa (job #1248823) | Cod sursa (job #2883848)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
cin >> T;
while(T--)
{
int N;
cin >> N;
vector<int> A(N + 1);
int first_zero = 0, last_zero = 0;
for(int i = 1; i <= N; ++i)
{
cin >> A[i];
if(!A[i])
{
if(!last_zero)
{
first_zero = i;
}
last_zero = i;
}
}
int left_cut = first_zero;
int right_cut = last_zero;
//int twom_left = 0, twom_right = 0;
int m_left = 0, m_right = 0;
int two = 0;
vector<tuple<int,int,int>> Ml;
for(int i = max(1, left_cut); i <= (right_cut ? right_cut : N); ++i)
{
if(A[i] == 2)
two++;
if(A[i] < 0)
m_left++;
if(A[i] == -2)
{
//twom_left++;
two++;
Ml.push_back(make_tuple(i, m_left, two));
}
}
vector<tuple<int,int,int>> Mr;
two = 0;
for(int i = (right_cut ? right_cut : N); i >= max(1, left_cut); --i)
{
if(A[i] == 2)
two++;
if(A[i] < 0)
m_right++;
if(A[i] == -2)
{
//twom_right++;
two++;
Mr.push_back(make_tuple(i, m_right, two));
}
}
if(left_cut == right_cut)
{
right_cut = 0;
}
//cout << Ml.size() << '\n';
if(Ml.empty())
{
cout << left_cut << " " << right_cut << '\n';
}
else
{
if(get<1>(Ml.back()) % 2)
{
//cout << "asddfasdf";
int dif_left = get<2>(Ml[Ml.size() - 1]) - get<2>(Ml[Ml.size() - 2]);
int dif_right = get<2>(Mr[Mr.size() - 1]) - get<2>(Mr[Mr.size() - 2]);
if(dif_left > dif_right)
{
left_cut = get<0>(Mr[Mr.size() - 2]);
}
else
{
right_cut = get<0>(Ml[Ml.size() - 2]);
}
}
cout << left_cut << " " << right_cut << '\n';
}
}
return 0;
}