Submission #1050956

#TimeUsernameProblemLanguageResultExecution timeMemory
1050956modwweSplit the sequence (APIO14_sequence)C++17
100 / 100
48 ms4448 KiB
#pragma GCC optimize("O3,fast-math") #include <bits/stdc++.h> using namespace std; using ll=long long; struct line { ll a, b; int c, i; }; int main() { ios::sync_with_stdio(0);cin.tie(0); int N, K; cin>>N>>K; K++; vector<ll> A(N+1); vector<int> P(N+1); for(int i=1; i<=N; i++) cin>>A[i], A[i]+=A[i-1]; vector<line> X(N+1); auto f=[&](ll dt) { int n=0, p=0; auto add=[&](line t) { if(p<n && X[n-1].a==t.a) { if(X[n-1].b>t.b) t=X[n-1]; n--; } while(p+1<n && __int128(X[n-2].b-X[n-1].b)*(t.a-X[n-1].a)>=__int128(X[n-1].b-t.b)*(X[n-1].a-X[n-2].a)) n--; X[n++]=t; }; auto get=[&](ll x) { while(p+1<n && X[p].b-X[p+1].b<=x*(X[p+1].a-X[p].a)) p++; return X[p]; }; add({0, 0, 0, 0}); for(int i=1; i<=N; i++) { auto[a,b,c,k]=get(2*(A[i]-A[N])); P[i]=k; add({A[i], a*2*(A[i]-A[N]) + 2*(A[N]-A[i])*A[i] + b - dt, c+1, i}); } return X[n-1].c; }; auto go=[&](const vector<int>& Q) { ll x=0; for(int i=1; i<K+1; i++) x+=ll(A[Q[i]]-A[Q[i-1]])*A[Q[i-1]]; cout<<x<<'\n'; for(int i=1; i<K; i++) cout<<Q[i]<<' '; exit(0); }; auto ga=[&](int k) { vector<int> Q(k+1); for(int i=N, j=k; i; i=P[i]) Q[j--]=i; if(k==K) go(Q); return Q; }; ll l=0, r=1e17; while(l<r) { ll m=(l+r)/2; auto k=f(m*2+1); if(k>K) l=m+1; else if(k<K) r=m; else ga(k), r=m; } auto L=ga(f(2*r-1)); auto R=ga(f(2*r+1)); vector<int> M(K+1); for(int i=1, p=0; i<L.size(); i++) { M[i-1]=L[i-1]; while(R[p]<=L[i-1]) p++; if(R[p]>=L[i] && i+R.size()-p==K+1) { while(p<R.size()) M[i++]=R[p++]; go(M); break; } } cout<<"No\n"; }

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:64:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |  for(int i=1, p=0; i<L.size(); i++) {
      |                    ~^~~~~~~~~
sequence.cpp:67:32: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   67 |   if(R[p]>=L[i] && i+R.size()-p==K+1) {
      |                    ~~~~~~~~~~~~^~~~~
sequence.cpp:68:11: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |    while(p<R.size()) M[i++]=R[p++];
      |          ~^~~~~~~~~
#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...