Submission #1056904

#TimeUsernameProblemLanguageResultExecution timeMemory
1056904PiokemonThe short shank; Redemption (BOI21_prison)C++17
55 / 100
961 ms524288 KiB
#include <bits/stdc++.h> using namespace std; typedef long long int ll; constexpr int N = 5e5; int a[N+9]; int pref[N+9]; int suf[N+9]; int skad[N+9]; vector<ll> tree[N+9]; vector<ll> lazy[N+9]; vector<ll> dp[N+9]; int base=1; void daj(int x, int p){ tree[p][2*x]+=lazy[p][x]; tree[p][2*x+1]+=lazy[p][x]; lazy[p][2*x]+=lazy[p][x]; lazy[p][2*x+1]+=lazy[p][x]; lazy[p][x]=0; } void add(int x, int l, int a, int b, int p, int k, ll val){ if (a>k || b<p)return; if (p<=a && b<=k){ tree[l][x]+=val; lazy[l][x]+=val; return; } daj(x,l); int mid=(a+b)/2; add(2*x,l,a,mid,p,k,val); add(2*x+1,l,mid+1,b,p,k,val); tree[l][x]=min(tree[l][2*x],tree[l][2*x+1]); } int query(int x, int l, int a, int b, int p, int k){ if (a>k || b<p)return 1e9; if (p<=a && b<=k)return tree[l][x]; daj(x,l); int mid=(a+b)/2; return min(query(2*x,l,a,mid,p,k),query(2*x+1,l,mid+1,b,p,k)); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,d,t; cin >> n >> d >> t; while(base<n)base*=2; vector<ll> empt(4*base+9,1e9); vector<ll> empt2(n+3,1e9); vector<ll> empt3(4*base+9,0); for (int x=0;x<=d+1;x++){tree[x]=empt;dp[x]=empt2;lazy[x]=empt3;} for (int x=1;x<=n;x++){ cin >> a[x]; } vector<pair<int,int>> stos; stos.push_back({2e9,-1}); for (int x=1;x<=n;x++){ int rang=-1; if (a[x]<=t)rang=x+t-a[x]; stos.push_back({rang,x}); while(stos.back().first<x)stos.pop_back(); skad[x]=stos.back().second; } //for (int x=1;x<=n;x++) cout << skad[x] << ' '; //cout << '\n'; add(1,0,0,base-1,0,0,-1e9); for (int x=1;x<=n+1;x++){ for (int y=1;y<=d+1;y++){ dp[y][x]=query(1,y-1,0,base-1,0,x-1); add(1,y,0,base-1,x,x,dp[y][x]-1e9); } if (skad[x]!=-1){ for (int y=0;y<=d+1;y++)add(1,y,0,base-1,0,skad[x],1); } /*for (int x=0;x<=n;x++) cout << query(1,0,0,base-1,x,x) << ' '; cout << '\n'; for (int x=0;x<=n;x++) cout << query(1,1,0,base-1,x,x) << ' '; cout << '\n'; for (int x=0;x<=n;x++) cout << query(1,2,0,base-1,x,x) << ' '; cout << '\n'; cout << '\n';*/ } //cout << dp[1][2] << '\n'; //cout << dp[2][4] << '\n'; cout << dp[d+1][n+1] << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...