Submission #442121

#TimeUsernameProblemLanguageResultExecution timeMemory
442121EvirirSplit the sequence (APIO14_sequence)C++17
0 / 100
82 ms17796 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; const bool DEBUG = 0; const int MAXN = 100005; const int MAXK = 205; struct Line { int m, b; Line(int _m, int _b) : m(_m), b(_b) {} inline int eval(int 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(int m, int b) { Line l = Line(m,b); while(irrelevant(l)) d.pop_back(); d.push_back(l); } Line query(int 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(); } }; int n,K; int s[MAXN]; int dp[MAXK][MAXN]; int nxt[MAXK][MAXN]; ConvexHull cht; 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]; } fore(i,1,K) { 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]-(ll)s[j]*s[j]); } cht.clear(); //cout<<"i="<<i<<endl; } vector<int> 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(int x: ans) cout<<x+1<<" "; cout<<'\n'; //watch(ans.size()); watch(K); 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...