제출 #222376

#제출 시각아이디문제언어결과실행 시간메모리
222376dwscGrudanje (COCI19_grudanje)C++14
70 / 70
792 ms11768 KiB
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
int prevArr[100010];
struct node{
    int s,e,m,v;
    node *l,*r;
    node(int _s,int _e){
        s = _s;
        e = _e;
        m = (s+e)/2;
        v = 0;
        if (s != e){
            l = new node(s,m);
            r = new node(m+1,e);
        }
    }
    void updateAll(){
        if (s == e) v = prevArr[s];
        else{
            l->updateAll();
            r->updateAll();
            v = max(l->v,r->v);
        }
    }
    int rmq(int x,int y){
        if(s == x && e == y) return v;
        if (y <= m) return l->rmq(x,y);
        if (x > m) return r->rmq(x,y);
        return max(l->rmq(x,m),r->rmq(m+1,y));
    }
}*root;
int main(){
    string s;
    cin >> s;
    int n,q;
    cin >> q;
    n = s.length();
    root = new node(0,n-1);
    ii arr[q];
    for (int i = 0; i < q; i++) {
        cin >> arr[i].first>> arr[i].second;
        arr[i].first--;
        arr[i].second--;
    }
    int toss[n+1];
    for (int i = 1; i <= n; i++) {
        cin >> toss[i];
        toss[i]--;
    }
    int l = 0,r = n+1;
    while (l != r){
        int m = (l+r)/2;
        //cout << m << "here\n";
        char temp[n];
        for (int i  =0; i < n; i++) temp[i] = s[i];
        for (int i = 1; i <= m; i++) temp[toss[i]] = '-';
        int pos[26];
        for (int i = 0; i < 26; i++) pos[i] = -1;
        for (int i = 0; i < n; i++){
            if (temp[i] == '-') prevArr[i] = -1;
            else{
                prevArr[i] = pos[temp[i]-97];
                pos[temp[i]-97] = i;
            }
            //cout << prevArr[i] << " ";
        }
        //cout << "\n";
        root->updateAll();
        int can = 1;
        for (int i = 0; i < q; i++){
            //cout << arr[i].first << " " << arr[i].second << "\n";
            //cout << root->rmq(arr[i].first,arr[i].second) << "hi\n";
            if (root->rmq(arr[i].first,arr[i].second) >= arr[i].first) can = 0;
        }
        if (can) r = m;
        else l = m+1;
    }
    cout << l;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...