제출 #1189414

#제출 시각아이디문제언어결과실행 시간메모리
1189414AlgorithmWarrior Martian DNA (BOI18_dna)C++20
100 / 100
90 ms9544 KiB
#include <bits/stdc++.h>

using namespace std;

int const INF=1000000000;
int const MAX=200005;
int n,alsz,req;
int v[MAX];
int nec[MAX];
int lstap[MAX];
int urm[MAX];
int cnt[MAX];
int capat[MAX];

void read(){
    cin>>n>>alsz>>req;
    int i;
    for(i=1;i<=n;++i)
        cin>>v[i];
    for(i=1;i<=req;++i){
        int lit,nr;
        cin>>lit>>nr;
        nec[lit]=nr;
    }
}

void precalc(){
    int i;
    for(i=n;i;--i){
        urm[i]=lstap[v[i]];
        lstap[v[i]]=i;
    }
}

void minself(int& x,int val){
    if(x>val)
        x=val;
}

int solve(){
    int i;
    int ok=0;
    for(i=1;i<=n && ok<req;++i){
        ++cnt[v[i]];
        if(cnt[v[i]]==nec[v[i]])
            ++ok;
    }
    int ans;
    if(ok<req)
        ans=INF;
    else{
        set<int>beg;
        int lt;
        for(lt=0;lt<alsz;++lt)
            if(nec[lt]){
                capat[lt]=lstap[lt];
                while(cnt[lt]>nec[lt]){
                    capat[lt]=urm[capat[lt]];
                    --cnt[lt];
                }
                beg.insert(capat[lt]);
            }
        ans=i-*beg.begin();
        for(;i<=n;++i){
            if(nec[v[i]]){
                beg.erase(capat[v[i]]);
                capat[v[i]]=urm[capat[v[i]]];
                beg.insert(capat[v[i]]);
            }
            minself(ans,i-*beg.begin()+1);
        }
    }
    return ans;
}

void write(int ans){
    if(ans<INF)
        cout<<ans;
    else
        cout<<"impossible";
}

int main()
{
    read();
    precalc();
    write(solve());
    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...