제출 #1339764

#제출 시각아이디문제언어결과실행 시간메모리
1339764alexddConference (JOI25_conference)C++20
0 / 100
2094 ms2004 KiB
#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n;
vector<int> v[3][3];
int sumv[3][3];

int solve_dominant(vector<int> cnt, int d)
{
    int A = -1, B = -1;
    for(int i=0;i<3;i++)
    {
        if(i != d)
        {
            if(A == -1)
                A = i;
            else
                B = i;
        }
    }
    assert(A != -1 && B != -1);

    /*cout<<d<<" dominant\n";
    cout<<A<<" A\n";
    cout<<B<<" B\n";

    cout<<v[A][A].size()<<" AA size\n";
    cout<<v[B][B].size()<<" BB size\n";
    cout<<v[A][B].size()<<" AB size\n";

    for(int x:v[A][A]) cout<<x<<" ";cout<<" v[A][A]\n";
    for(int x:v[B][B]) cout<<x<<" ";cout<<" v[B][B]\n";
    for(int x:v[A][B]) cout<<x<<" ";cout<<" v[A][B]\n";*/

    int base = 0;
    for(int i=0;i<3;i++)
        for(int j=i+1;j<3;j++)
            base += 1 * v[i][j].size();

    //cout<<base<<" minimum\n";



    /*cout<<A<<" "<<v[A][A].size()<<" AA\n";
    cout<<B<<" "<<v[B][B].size()<<" BB\n";
    cout<<" "<<v[A][B].size()<<" AB\n";*/

    if(cnt[A] > sumv[A][A] + sumv[A][B])
    {
        swap(A, B);
    }

    //cout<<base<<" minimum\n";

    if(cnt[B] <= sumv[B][B] + sumv[A][B])
    {
        base += 1 * v[A][B].size();
        base += 2 * v[A][A].size();
        base += 2 * v[B][B].size();

        //cout<<base<<" base\n";

        int rez = INF;
        for(int cntAA=0;cntAA<=v[A][A].size();cntAA++)
        {
            int aux = base;
            int ramasA = cnt[A];
            for(int i=0;i<cntAA;i++)
            {
                ramasA -= v[A][A][i];
                aux -= 2;
            }

            if(ramasA < 0)
                continue;

            int cateAB = 0;
            vector<int> newAB;
            for(int i=0;i<v[A][B].size();i++)
            {
                if(ramasA >= v[A][B][i])
                {
                    cateAB++;
                    ramasA -= v[A][B][i];
                    aux -= 1;
                }
                else
                {
                    newAB.push_back(v[A][B][i] - ramasA);
                    ramasA = 0;
                }
            }

            for(int cntBB=0;cntBB<=v[B][B].size();cntBB++)
            {
                int ramasB = cnt[B], myaux = aux;
                //cout<<cntBB<<" "<<cnt[B]<<" cnt[B]\n";
                for(int i=0;i<cntBB;i++)
                {
                    ramasB -= v[B][B][i];
                    myaux -= 2;
                }
                //cout<<cntBB<<" "<<ramasB<<" ramasB\n";
                if(ramasB < 0)
                    continue;
                for(int i=0;i<newAB.size();i++)
                {
                    if(ramasB >= newAB[i])
                    {
                        ramasB -= newAB[i];
                        myaux -= 1;
                    }
                }
                //cout<<cntAA<<" "<<cntBB<<" "<<cateAB<<": "<<myaux<<"\n";
                rez = min(rez, myaux);
            }
        }
        return rez;
    }
    else
    {
        assert(0);
        return -1;
    }
}

signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n;
    string s;
    cin>>s;
    assert(s.size() == n);
    for(int i=0;i<n;i++)
    {
        if(s[i] != '?' && i!=n-1)
        {
            int poz = i + 1;
            while(poz < n && s[poz] == '?')
                poz++;
            v[s[i]-'A'][s[poz]-'A'].push_back(poz - i - 1);
            if(s[i] != s[poz]) v[s[poz]-'A'][s[i]-'A'].push_back(poz - i - 1);
            //cerr<<s[i]<<" "<<s[poz]<<": "<<poz-i-1<<" v\n";
        }
    }
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
        {
            sort(v[i][j].begin(), v[i][j].end());
            sumv[i][j] = 0;
            for(int x:v[i][j])
                sumv[i][j] += x;
        }
    int q;
    cin>>q;
    for(int i=1;i<=q;i++)
    {
        vector<int> cnt(3);
        for(int c=0;c<3;c++)
            cin>>cnt[c];
        //cerr<<cnt[0]<<" "<<cnt[1]<<" "<<cnt[2]<<" zzz\n";

        vector<int> dominants;
        for(int d=0;d<3;d++)
        {
            if(cnt[d] > sumv[d][0] + sumv[d][1] + sumv[d][2])
            {
                dominants.push_back(d);
            }
        }
        assert(!dominants.empty());
        if(dominants.empty())//--------------------------------------------------------------
        {
            cout<<solve_dominant(cnt, 0)<<" empty\n";
        }
        else if(dominants.size() == 1)
        {
            //assert(dominants.size() <= 2);
            cout<<solve_dominant(cnt, dominants[0])<<"\n";
        }
        else
        {
            assert(dominants.size() == 2);
            cout<<-1<<"\n";
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...