Submission #1322686

#TimeUsernameProblemLanguageResultExecution timeMemory
1322686benightGroup Photo (JOI21_ho_t3)C++20
100 / 100
2482 ms1304 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/tree_policy.hpp> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define ll long long #define pb push_back #define vi vector<ll> #define f(i,a,b) for(ll i=a;i<b;i++) #define fr(i,a,b) for(ll i=a;i>=b;i--) #define fa(e,l) for(auto e:l) #define all(arr) arr.begin(),arr.end() #define pii pair<ll,ll> #define tii tuple<ll,ll,ll> #define coutpii(x) fa(e,x){cout<<e.first<<","<<e.second<<"\n";}cout<<"\n" #define couttup(x) fa(e,x){ll A,B,C,D,F;tie(A,B,C,D,F)=e;cout<<A<<","<<B<<","<<C<<","<<D<<","<<F<<"\n";}cout<<"\n" #define coutll(x) fa(e,x){cout<<e<<" ";}cout<<"\n" #define ordered_set tree<pii,null_type,less<pii>,rb_tree_tag,tree_order_statistics_node_update> #define vvi vector<vi> #define v(a) vector<a> ll func(ll a,ll b){return a+b;} pair<vi,ll> seg(vi& arr,ll iv){ ll n=arr.size(),d=0; while((1LL<<d)<n)d++; ll n1=1LL<<d; vi t(2*n1,iv); f(i,0,n)t[n1+i]=arr[i]; fr(i,n1-1,1)t[i]=func(t[i*2],t[i*2+1]); return {t,n1}; } void update(vi& t,ll x,ll v,ll n1){ x+=n1; t[x]=v; x/=2; while(x>0){ t[x]=func(t[x*2],t[x*2+1]); x/=2; } } ll sum(ll l,ll r,vi& t,ll n1){ l+=n1;r+=n1; ll a=0; while(l<=r){ if(l%2==1){a=func(a,t[l]);l++;} if(r%2==0){a=func(a,t[r]);r--;} l/=2;r/=2; } return a; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); ll n;cin>>n; vi h(n+1),p(n+1); f(i,1,n+1){cin>>h[i];p[h[i]]=i;} ll m=n+2; vi z(m,0),t1;ll n1; tie(t1,n1)=seg(z,0); const ll INF=(1LL<<62); vi dp(n+1,INF); dp[0]=0; vi tp,tb,cp(m,0),cb(m,0); f(i,1,n+1){ fill(all(cp),0); fill(all(cb),0); fill(all(z),0); f(vv,1,i){z[p[vv]]=1;cp[p[vv]]=1;} tie(tp,n1)=seg(z,0); fill(all(z),0); z[p[i]]=1;cb[p[i]]=1; tie(tb,n1)=seg(z,0); ll ic=0; ll ci=(i-1)-sum(1,p[i],tp,n1); ll bst=INF; for(ll l=i;l>=1;l--){ bst=min(bst,dp[l-1]+ic+ci); if(l==1)break; ll vv=l-1; ll A=sum(1,p[vv]-1,tb,n1); cp[p[vv]]--; update(tp,p[vv],cp[p[vv]],n1); ll ps=vv-1; ll B=ps-sum(1,p[vv],tp,n1); ci=ci-A+B; ll os=i-l+1; ll ge=os-sum(1,p[vv],tb,n1); ic+=ge; cb[p[vv]]++; update(tb,p[vv],cb[p[vv]],n1); // if(i==9&&l==4)cout<<ic<<" "<<ci<<"\n"; // cout<<i<<" "<<l<<" "<<bst<<"\n"; } dp[i]=bst; // cout<<i<<" "<<dp[i]<<"\n"; } cout<<dp[n]<<"\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...