Cod sursa(job #2883848)

Utilizator PatrascuAdrian1Patrascu Adrian Octavian PatrascuAdrian1 Data 1 aprilie 2022 21:53:02
Problema Potrivirea sirurilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.37 kb
#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;
}