Submission #1112736

#TimeUsernameProblemLanguageResultExecution timeMemory
11127360pt1mus23 Martian DNA (BOI18_dna)C++14
100 / 100
1262 ms27000 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int #define ins insert #define pb push_back #define endl '\n' #define putr(x) cout<<x<<endl;return; #define all(x) x.begin(),x.end() int nxt(){ int x;cin>>x; return x; } const int mod = 1e9 +7, sze = 2e5 +23, inf = LLONG_MAX, LG = 20; int T[sze*4]; int mal[sze]; int got[sze]; int gotur=0; void build(int node,int l,int r){ if(l==r){ T[node]=mal[l]; return; } int mid = (l+r)/2; build(2*node,l,mid); build(2*node +1,mid+1,r); T[node]=min(T[node *2 ],T[node *2 +1]); } int qry(int node,int l,int r,int lx,int rx){ if( lx>r || rx<l ){ return inf; } if(l<=lx && rx<=r){ return T[node]; } int mid = (lx+rx)/2; int left = qry(2*node,l,r,lx,mid); int right = qry(2*node +1,l,r,mid+1,rx); return min(left,right); } void upd(int node,int idx,int lx,int rx,int to){ if(lx==rx){ T[node]=to; return; } int mid = (lx+rx)/2; if( idx<=mid){ upd(2*node,idx,lx,mid,to); } else{ upd(2*node +1,idx,mid+1,rx,to); } T[node]=min(T[node *2 ],T[node *2 +1]); } void fast(){ int n,k,rq; cin>>n>>k>>rq; map<int,vector<int>> var; vector<int> arr(n+1,0); generate(arr.begin()+1,arr.end(),nxt); vector<int> lazim(n+10,0); vector<int> last(n+10,0); int goturmeli = rq; while(rq--){ int b,q; cin>>b>>q; lazim[b]=q; } for(int i=1;i<=n;i++){ mal[i]=inf; if(lazim[arr[i]]){ mal[i]=-inf; if(!var[arr[i]].empty()){ last[i]=var[arr[i]].back(); } var[arr[i]].pb(i); if(var[arr[i]].size()>=lazim[arr[i]]){ mal[i]=var[arr[i]][ var[arr[i]].size() - lazim[arr[i]] ]; } } } // for(int i =0;i<n;i++){ // cout<<mal[i+1]<<" "; // } // cout<<endl; build(1,0,n); // cout<<qry(1,1,2,0,n)<<endl; int l =1; int r = n; int ans=-1; // cout<<qry(1,2,5,0,n)<<endl; while(l<=r){ int mid = (l+r)/2; bool flag=false; gotur = 0; for(int i =0;i<=n;i++){ got[i]=0; } vector<pair<int,int>> recov; for(int i =1;i<=mid;i++){ if(lazim[arr[i]]){ if(++got[arr[i]]==1){ ++gotur; } else{ recov.pb({last[i],mal[last[i]]}); upd(1,last[i],0,n,inf); } } } if(gotur == goturmeli && qry(1,1,mid,0,n) > 0){ flag=true; } else{ for(int i =mid+1;i<=n;i++){ if(lazim[ arr[i - mid] ]){ if( (--got[arr[i-mid]]) ==0){ --gotur; } } if(lazim[arr[i]]){ if( (++got[arr[i]]) ==1 ){ ++gotur; } else{ // cout<<mid<<" sil"<<last[i]<<endl; recov.pb({last[i],mal[last[i]]}); upd(1,last[i],0,n,inf); } } if(gotur == goturmeli && qry(1,i-mid+1,i,0,n) > i-mid){ // cout<<mid<< " "<<i<<" "<<qry(1,i-mid+1,i,0,n)<<endl; flag=true; break; } } } for(auto [p,b]:recov){ upd(1,p,0,n,b); } if(flag){ ans = mid; r = mid-1; } else{ l = mid+1; } } if(ans==-1){ putr("impossible"); } putr(ans); } signed main(){ // ios::sync_with_stdio(0); // cin.tie(0); // cout.tie(0); int tt = 1; // cin>>tt; while(tt--){ fast(); } return 0; }

Compilation message (stderr)

dna.cpp: In function 'void fast()':
dna.cpp:80:34: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} [-Wsign-compare]
   80 |             if(var[arr[i]].size()>=lazim[arr[i]]){
dna.cpp:145:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  145 |         for(auto [p,b]:recov){
      |                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...