Submission #518864

#TimeUsernameProblemLanguageResultExecution timeMemory
518864Ierus Martian DNA (BOI18_dna)C++17
40 / 100
133 ms152012 KiB
#include<bits/stdc++.h> using namespace std; #pragma GCC optimize ("unroll-loops,Ofast,O3") #pragma GCC target("avx,avx2,fma") #define F first #define S second #define sz(x) (int)x.size() #define pb push_back #define eb emplace_back #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define NFS ios_base::sync_with_stdio(0) , cin.tie(0) , cout.tie(0) ; #define file(s) if (fopen(s".in", "r")) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout) typedef long long ll; //random_device(rd); //mt19937 rng(rd()); //const long long FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count(); //template<class T> T randomize(T mod){ // return (uniform_int_distribution<T>(0, mod))(rng); //} const int E = 1e6+777; const long long inf = 1e18+777; const int N = 4000+777; const int MOD = 1e9+7; const bool I = 0; int n, k, r, a[N], pref[N][4000], need[4000]; int main(){const auto solve=[&]() -> void{ cin >> n >> k >> r; for(int i = 1; i <= n; ++i){ cin >> a[i]; // cerr << i << " -> " << a[i] << '\n'; for(int j = 0; j < k; ++j){ pref[i][j] = pref[i-1][j] + (a[i] == j); } } for(int i = 1; i <= r; ++i){ int type, cnt; cin >> type >> cnt; need[type] = cnt; } // cerr << "need\n"; // for(int i = 0; i < k; ++i){ // cerr << i << " -> " << need[i] << '\n'; // } // cerr << "pref\n"; // for(int i = 0; i < k; ++i){ // cerr << "i: " << i << '\n'; // for(int j = 1; j <= n; ++j){ // cerr << pref[j][i] << ' '; // }cerr << '\n'; // } auto check = [&](int L, int R) -> bool{ for(int j = 0; j < k; ++j){ if(pref[R][j] - pref[L-1][j] < need[j]){ return false; } } return true; }; int res = INT_MAX; for(int i = 1; i <= n; ++i){ int L = i, R = n, ans = -1; while(L <= R){ int M = (L + R) / 2; // cerr << "L: " << L << " R: " << R << " M: " << M << '\n'; if(check(i, M)){ R = (ans = M) - 1; }else L = M + 1; } // cerr << i << " -> " << ans << '\n'; // cerr << " changed " << res << '\n'; if(ans != -1){ res = min(res, ans - i + 1); } } if(res == INT_MAX) cout << "impossible"; else cout << res; };NFS;int T=1;if(I)cin>>T;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...