Submission #250664

#TimeUsernameProblemLanguageResultExecution timeMemory
250664EvirirSplit the sequence (APIO14_sequence)C++17
71 / 100
263 ms131076 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define watch(x) cout<<(#x)<<"="<<(x)<<'\n' #define mset(d,val) memset(d,val,sizeof(d)) #define setp(x) cout<<fixed<<setprecision(x) #define forn(i,a,b) for(int i=(a);i<(b);i++) #define fore(i,a,b) for(int i=(a);i<=(b);i++) #define pb push_back #define F first #define S second #define pqueue priority_queue #define fbo find_by_order #define ook order_of_key typedef long long ll; typedef pair<ll,ll> ii; typedef vector<ll> vi; typedef vector<ii> vii; typedef long double ld; typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds; void amin(ll &a, ll b){ a=min(a,b); } void amax(ll &a, ll b){ a=max(a,b); } void YES(){cout<<"YES\n";} void NO(){cout<<"NO\n";} void SD(int t=0){ cout<<"PASSED "<<t<<endl; } const ll INF = ll(1e18); const int MOD = 998244353; struct Line { ll m, b; Line(ll _m, ll _b) : m(_m), b(_b) {} inline ll eval(ll x) { return m * x + b; } }; struct ConvexHull { deque<Line> d; inline void clear() { d.clear(); } bool irrelevant(Line Z) { if(int(d.size()) < 2) return false; Line X = d[int(d.size())-2], Y = d[int(d.size())-1]; return (X.b - Z.b) * (Y.m - X.m) <= (X.b - Y.b) * (Z.m - X.m); } void addline(ll m, ll b) { Line l = Line(m,b); while(irrelevant(l)) d.pop_back(); d.push_back(l); } Line query(ll x) { if(d.empty()) return Line{0,0}; while(int(d.size()) > 1 && (d[0].b - d[1].b <= x * (d[1].m - d[0].m))) d.pop_front(); return d.front(); } }; const bool DEBUG = 0; const int MAXN = 100005; const int MAXK = 205; int n,K; ll s[MAXN], dp[MAXK][MAXN], nxt[MAXK][MAXN]; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>K; forn(i,0,n){ cin>>s[i]; if(i>0) s[i]+=s[i-1]; } ConvexHull cht; fore(i,1,K) { cht.clear(); forn(j,0,n) { Line res = cht.query(s[j]); nxt[i][j] = res.m; dp[i][j] = res.eval(s[j]); cht.addline(s[j], dp[i-1][j]-s[j]*s[j]); } } vi ans; int cur=n-1; for(int i=K;i>=1;i--){ for(int j=cur-1;j>=0;j--){ if(s[j]==nxt[i][cur]){ ans.pb(j); cur=j; break; } } } cout<<dp[K][n-1]<<'\n'; for(ll x: ans) cout<<x+1<<" "; cout<<'\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...