Submission #1272216

#TimeUsernameProblemLanguageResultExecution timeMemory
1272216Davdav1232 Martian DNA (BOI18_dna)C++20
100 / 100
123 ms14132 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef vector<vi> vvi;

int n, k, r;
vi dna;
vector<pair<int, int>> req;



int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
	cin>>n>>k>>r;
    dna.resize(n);
    for(int i=0; i<n; i++) cin>>dna[i];
    req.resize(r);
    for(int i=0; i<r; i++){
        cin>>req[i].first;
        cin>>req[i].second;
    }
    vi t(n);
    sort(req.begin(), req.end());
    //check if n works
    vvi where(r);
    for(int i=0; i<n; i++){
        //find which of the r it is
        if(dna[i]<req[0].first || dna[i]>req[r-1].first){
            t[i]=-1;
        }
        if(dna[i]==req[0].first){
            where[0].push_back(i);
            t[i]=0;
            continue;
        }
        int a=0;
        int b=r-1;
        while(a+1<b){
            int c=(a+b)/2;
            if(req[c].first>=dna[i]) b=c;
            else a=c;
        }
        if(req[b].first==dna[i]){ 
            where[b].push_back(i);
            t[i]=b;
        }
        else t[i]=-1;
    }
    for(int i=0; i<r; i++){
        if(where[i].size()<req[i].second){
            cout<<"impossible";
            return 0;
        }
    }
    //now for every index I want to find the minimal length that starts with it that works.
    //rnlogn easy
    vi ans(n, 1e9);
    vi indexes(r);
    for(int i=0; i<r; i++){
        indexes[i]=req[i].second-1;
    }
    set<int> places;
    for(int i=0; i<r; i++){
        places.insert(-where[i][indexes[i]]);
    }
    for(int i=0; i<n; i++){
        if(i>0){
            if(t[i-1]>-1){
                places.erase(-where[t[i-1]][indexes[t[i-1]]]);
                indexes[t[i-1]]++;
                if(indexes[t[i-1]]>=where[t[i-1]].size()){
                    break;
                }
                places.insert(-where[t[i-1]][indexes[t[i-1]]]);
            }
        }
        
        ans[i]=-*places.begin()-i+1;
    }
    for(int i=0; i<n; i++){
        ans[0]=min(ans[0], ans[i]);
    }
    cout<<ans[0];
    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...