Submission #378286

#TimeUsernameProblemLanguageResultExecution timeMemory
378286Sara Martian DNA (BOI18_dna)C++14
100 / 100
347 ms21484 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define pb push_back #define F first #define S second const int N = 200000 + 5; const int LOG = 30; int n, k, R, a[N]; vector <int> ids[N]; pair <int, int> p[N]; int pntl[N], pntr[N]; vector <int> all[N]; int cnt_ok; inline int get(int id){ int ret = 0; int x = p[id].F; int sz = ids[x].size(); if (pntl[id] < sz){ ret = pntr[id] - pntl[id]; } return ret; } inline void update_l(int z){ for (int it : all[z]){ int bef = get(it); pntl[it] ++; int aft = get(it); if (p[it].S <= bef){ cnt_ok --; } if (p[it].S <= aft){ cnt_ok ++; } } return; } inline void update_r(int z){ for (int it : all[z]){ int bef = get(it); pntr[it] ++; int aft = get(it); if (p[it].S <= bef){ cnt_ok --; } if (p[it].S <= aft){ cnt_ok ++; } } return; } inline void pre(){ for (int i = 0; i < R; i ++){ int x = p[i].F; int sz = ids[x].size(); for (int j = 0; j < sz; j ++){ all[ids[x][j]].pb(i); } } return; } bool ok(int len){ if (n < len) return 0; int strt = 1; for (int i = 0; i < R; i ++){ int x = p[i].F; if (ids[x].empty()){ return 0; } strt = max(strt, ids[x][0] - len + 1); pntl[i] = pntr[i] = 0; } cnt_ok = 0; for (int i = 0; i < R; i ++){ int x = p[i].F; int y = p[i].S; int sz = ids[x].size(); while (pntl[i] < sz && ids[x][pntl[i]] < strt){ pntl[i] ++; } while (pntr[i] < sz && ids[x][pntr[i]] <= strt + len - 1){ pntr[i] ++; } if (y <= get(i)){ cnt_ok ++; } } if (cnt_ok == R){ return 1; } for (int l = strt + 1; l + len - 1 <= n; l ++){ int r = l + len - 1; update_l(l - 1); update_r(r); if (cnt_ok == R){ return 1; } } return 0; } int main() { ios_base::sync_with_stdio(0), cin.tie(0); cout.tie(0); cin >> n >> k >> R; for (int i = 1; i <= n; i ++){ cin >> a[i]; ids[a[i]].pb(i); } for (int i = 0; i < R; i ++){ cin >> p[i].F >> p[i].S; } pre(); int l = 0, r = n + 1; while (l + 1 < r){ int mid = (l + r) / 2; if (ok(mid)){ r = mid; } else { l = mid; } } if (r == n + 1){ cout << "impossible\n"; } else { cout << r << '\n'; } 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...