Submission #603278

#TimeUsernameProblemLanguageResultExecution timeMemory
603278AdamGSFeast (NOI19_feast)C++17
100 / 100
179 ms120688 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; #define rep(a, b) for(int a = 0; a < (b); ++a) #define st first #define nd second #define pb push_back #define all(a) a.begin(), a.end() struct Node { ll pref; int ind_pref; ll inv_pref; int inv_ind_pref; ll suf; int ind_suf; ll inv_suf; int inv_ind_suf; ll psoms; int indl_psoms, indr_psoms; ll inv_psoms; int inv_indl_psoms, inv_indr_psoms; ll sum; int lazy; }; const int LIM=1<<20, INF=1e9+7; ll T[LIM], N=1, n, k; Node tr[2*LIM], pusty; void inv(int v) { swap(tr[v].pref, tr[v].inv_pref); swap(tr[v].ind_pref, tr[v].inv_ind_pref); swap(tr[v].suf, tr[v].inv_suf); swap(tr[v].ind_suf, tr[v].inv_ind_suf); swap(tr[v].psoms, tr[v].inv_psoms); swap(tr[v].indl_psoms, tr[v].inv_indl_psoms); swap(tr[v].indr_psoms, tr[v].inv_indr_psoms); tr[v].sum*=-1; tr[v].lazy^=1; } void spl(int v) { inv(2*v); inv(2*v+1); tr[v].lazy=0; } void lacz(int v) { tr[v].pref=tr[2*v].pref; tr[v].ind_pref=tr[2*v].ind_pref; if(tr[2*v].sum+tr[2*v+1].pref>tr[v].pref) { tr[v].pref=tr[2*v].sum+tr[2*v+1].pref; tr[v].ind_pref=tr[2*v+1].ind_pref; } tr[v].suf=tr[2*v+1].suf; tr[v].ind_suf=tr[2*v+1].ind_suf; if(tr[2*v+1].sum+tr[2*v].suf>tr[v].suf) { tr[v].suf=tr[2*v+1].sum+tr[2*v].suf; tr[v].ind_suf=tr[2*v].ind_suf; } tr[v].psoms=tr[2*v].psoms; tr[v].indl_psoms=tr[2*v].indl_psoms; tr[v].indr_psoms=tr[2*v].indr_psoms; if(tr[2*v+1].psoms>tr[v].psoms) { tr[v].psoms=tr[2*v+1].psoms; tr[v].indl_psoms=tr[2*v+1].indl_psoms; tr[v].indr_psoms=tr[2*v+1].indr_psoms; } if(tr[2*v].suf+tr[2*v+1].pref>tr[v].psoms) { tr[v].psoms=tr[2*v].suf+tr[2*v+1].pref; tr[v].indl_psoms=tr[2*v].ind_suf; tr[v].indr_psoms=tr[2*v+1].ind_pref; } tr[v].inv_pref=tr[2*v].inv_pref; tr[v].inv_ind_pref=tr[2*v].inv_ind_pref; if(-tr[2*v].sum+tr[2*v+1].inv_pref>tr[v].inv_pref) { tr[v].inv_pref=-tr[2*v].sum+tr[2*v+1].inv_pref; tr[v].inv_ind_pref=tr[2*v+1].inv_ind_pref; } tr[v].inv_suf=tr[2*v+1].inv_suf; tr[v].inv_ind_suf=tr[2*v+1].inv_ind_suf; if(-tr[2*v+1].sum+tr[2*v].inv_suf>tr[v].inv_suf) { tr[v].inv_suf=-tr[2*v+1].sum+tr[2*v].inv_suf; tr[v].inv_ind_suf=tr[2*v].inv_ind_suf; } tr[v].inv_psoms=tr[2*v].inv_psoms; tr[v].inv_indl_psoms=tr[2*v].inv_indl_psoms; tr[v].inv_indr_psoms=tr[2*v].inv_indr_psoms; if(tr[2*v+1].inv_psoms>tr[v].inv_psoms) { tr[v].inv_psoms=tr[2*v+1].inv_psoms; tr[v].inv_indl_psoms=tr[2*v+1].inv_indl_psoms; tr[v].inv_indr_psoms=tr[2*v+1].inv_indr_psoms; } if(tr[2*v].inv_suf+tr[2*v+1].inv_pref>tr[v].inv_psoms) { tr[v].inv_psoms=tr[2*v].inv_suf+tr[2*v+1].inv_pref; tr[v].inv_indl_psoms=tr[2*v].inv_ind_suf; tr[v].inv_indr_psoms=tr[2*v+1].inv_ind_pref; } tr[v].sum=tr[2*v].sum+tr[2*v+1].sum; } void upd(int v, int l, int r, int a, int b) { if(b<l || a>r) return; if(a<=l && r<=b) { inv(v); return; } if(tr[v].lazy) spl(v); int mid=(l+r)/2; upd(2*v, l, mid, a, b); upd(2*v+1, mid+1, r, a, b); lacz(v); } ll dynamiczny_psoms(int x) { rep(i, 2*N) tr[i]=pusty; rep(i, n) tr[N+i]={T[i], i, -T[i], i, T[i], i, -T[i], i, T[i], i, i, -T[i], i, i, T[i], 0}; for(int i=N-1; i; --i) lacz(i); ll ans=0; while(x--) { if(tr[1].psoms<=0) break; ans+=tr[1].psoms; upd(1, 0, N-1, tr[1].indl_psoms, tr[1].indr_psoms); } return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k; k=min(n, k); while(N<n) N*=2; rep(i, n) cin >> T[i]; cout << dynamiczny_psoms(k) << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...