Submission #1366561

#TimeUsernameProblemLanguageResultExecution timeMemory
1366561avahwGift Boxes (EGOI25_giftboxes)C++20
100 / 100
1234 ms27216 KiB
#include <bits/stdc++.h>
using namespace std;

pair<int, int> check(int len, vector<int>& ppl){
    int n = ppl.size();
    int dupes = 0;
    unordered_map<int, int> freq;
    pair<int, int> ans = {-1, -1};
    // add everyone after len
    for(int i = len; i < n; i++){
        int e = ppl[i];
        freq[e]++;
        if(freq[e] == 2) dupes++;
    }
    if(dupes == 0) return {0, len - 1};
    for(int i = len; i < n; i++){
        int prev = ppl[i - len];
        int curr = ppl[i];
        // add prev
        freq[prev]++;
        if(freq[prev] == 2) dupes++;
        // remove curr
        freq[curr]--;
        if(freq[curr] == 1) dupes--;
        // check
        if(dupes == 0) return {i - len + 1, i};
    }
    return ans;
}



int main(){
    cin.tie(0);
    ios::sync_with_stdio(0);
    int t, n;
    cin >> t >> n;
    vector<int> ppl(n);
    for(int i = 0; i < n; i++) cin >> ppl[i];
    int l = 1;
    int r = n; 
    int m = (l + r) / 2;
    pair<int, int> good = {-1, -1};
    while(l < r){
        // can we do a seg of length m?
        pair<int, int> seg = check(m, ppl);
        if(seg.first == -1){
            l = m + 1;
        }
        else{
            r = m;
            good = seg;
        }
        m = (l + r) / 2;
    }
    cout << good.first << " " << good.second << "\n";
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...