제출 #1272215

#제출 시각아이디문제언어결과실행 시간메모리
1272215yehudalester Martian DNA (BOI18_dna)C++20
100 / 100
417 ms13316 KiB
#include<bits/stdc++.h> #include<chrono> using namespace std; using namespace chrono; using ll=long long; const ll SZ=1<<19; struct seg{ vector<ll> vec=vector<ll>(2*SZ,1e18); void upd(ll i, ll k){ vec[i+=SZ]=k; while(i/=2)vec[i]=min(vec[2*i],vec[2*i+1]); } ll get(ll i){ return vec[i+SZ]; } void add(ll i, ll k){ upd(i,get(i)+k); } ll getmin(){ return vec[1]; } }; struct mset{ seg st; mset(vector<ll> r){ for(ll i=0;i<r.size();i++){ st.upd(i,-r[i]); } } void add(ll x){ st.add(x,1); } void rm(ll x){ st.add(x,-1); } bool valid(){ return st.getmin()>=0; } }; int main(){ ll n,k,R;cin>>n>>k>>R; vector<ll> vec(n);for(ll&i:vec)cin>>i; vector<ll> r(k); for(ll i=0;i<R;i++){ ll a,b;cin>>a>>b; r[a]=b; }{ mset m(r); for(ll i:vec)m.add(i); if(!m.valid()){cout<<"impossible";return 0;} } ll l=0,h=n; while(l<h){ ll m=(l+h)/2; mset ms(r); for(int i=0;i<m;i++)ms.add(vec[i]); for(int i=m;i<n;i++){ if(ms.valid())break; ms.add(vec[i]);ms.rm(vec[i-m]); } if(ms.valid())h=m; else l=m+1; } cout << h; 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...