Submission #862051

#TimeUsernameProblemLanguageResultExecution timeMemory
862051KK_1729 Martian DNA (BOI18_dna)C++17
100 / 100
54 ms18128 KiB
#include <bits/stdc++.h> using namespace std; // #define int long long #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define pb push_back #define all(a) a.begin(), a.end() #define endl "\n" void printVector(vector<int> a){ for (auto x: a) cout << x << " "; cout << endl; } void solve(){ int n, k, r; cin >> n >> k >> r; vector<int> d(n); FOR(i,0,n) cin >> d[i]; vector<vector<int>> o(k); FOR(i,0,n) o[d[i]].pb(i); vector<int> e(k+1); FOR(i,0,r){ int x, y; cin >> x >> y; e[x] = y; } vector<int> start(n); vector<int> end(n); vector<int> prev(n); vector<int> next(n); FOR(i,0,k){ int h = o[i].size(); if (e[i] == 0) continue; int l = 0; int j = e[i]-1; while (j < h){ start[o[i][l]] = 1; end[o[i][j]] = 1; prev[o[i][j]] = o[i][l]; next[o[i][l]] = o[i][j]; l++; j++; } } // printVector(start); // printVector(end); int first = 0; int second = n; int count = 0; int answer = n+1; while (first <= second){ int mid = (first+second+1)/2; int l = 0; int j = mid-1; bool can = false; // vector<int> s(k), l(k); vector<int> current(k); int active = 0; FOR(i,l,j+1){ if (end[i]){ if (prev[i] >= l){ current[d[i]]++; if (current[d[i]] == 1) active++; } } if (active >= r){ l = mid; can = true; } } while (j < n){ if (start[l] && next[l] <= j){ current[d[l]]--; if (current[d[l]] == 0) active--; } l++; j++; if (end[j] && prev[j] >= l){ current[d[j]]++; if (current[d[j]] == 1) active++; } if (active >= r) can = true; } // cout << mid << can << endl; if (can){ second = mid; answer = min(answer, mid); }else{ first = mid; } if (second-first <= 1){ count++; if (count > 2){ first = second; } } if (first == second) break; // cout << first << second << endl; // if ()break; } if (answer > n) cout << "impossible" << endl; else cout << answer << endl; } int32_t main(){ ios::sync_with_stdio(false);cin.tie(0); int t = 1; while (t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...