Submission #891053

#TimeUsernameProblemLanguageResultExecution timeMemory
891053kokoxuya Martian DNA (BOI18_dna)C++14
100 / 100
91 ms142420 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int N, K, R, temp1,temp2; 
    cin >> N >> K >> R;
    vector<int>strand(N);
    vector<int>requirements(K);
    vector<queue<int>>positions(K);
    vector<int>nummet(K);
    int reqmet = K;
    fill(requirements.begin(),requirements.end(),0);
    fill(nummet.begin(),nummet.end(),0);

    for (int a = 0; a < N; a++)
    {
        cin >> strand[a];
    }
    for (int a = 0; a < R; a++)
    {
        cin >> temp1 >> temp2; //type, need
        requirements[temp1] = temp2;
        reqmet--;
    }
    vector<int>requirementscopy(requirements.begin(),requirements.end());
    queue<pair<int,int>>tracker; //position, dna type
    /*cout << "outputting requirements:\n";
    for (int a = 0 ; a < K; a++)
    {
        cout << requirements[a] << " ";
    }
    cout << "\n";*/

    if (R == 0) //no requirements, sui bian ni! :D
    {
        cout << 0;
        return 0;
    }

    int currdna, ans = LLONG_MAX;
    for (int a = 0; a < N; a++)
    {
        currdna = strand[a];
        if (!requirementscopy[currdna]) //if you dont need that dna
        {
            continue;
        }
        if (requirements[currdna] == 1) //just hit the needed goal!
        {
            //cout << "met requirement for " << currdna << " at " << a << "\n";
            reqmet++; 
        }
        requirements[currdna]--;
        positions[currdna].push(a); //if you go over the required amount, cut out the first one
        nummet[currdna] ++;
        tracker.push(make_pair(a,currdna));
        if (nummet[currdna] > requirementscopy[currdna]) //youve met mroe than u need
        {
            positions[currdna].pop();
        }
        
        //checking :)

        if (reqmet == K)
        {
            while (tracker.front().first != (positions[tracker.front().second].front()))
            {
                tracker.pop();
            }
            ans = min(ans, (a - tracker.front().first + 1));
        }
    }

    /*for (int a = 0 ; a < K; a++)
    {
        cout << a << " : \n";
        while(!positions[a].empty())
        {
            cout << positions[a].front() << " ";
            positions[a].pop();
        }
        cout << "\n";
    }
    cout << "\n";*/

    if (ans == LLONG_MAX)
    {
        cout << "impossible";
    }
    else
    {
        cout << ans;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...