Submission #230655

#TimeUsernameProblemLanguageResultExecution timeMemory
230655alishahali1382Split the sequence (APIO14_sequence)C++14
100 / 100
1056 ms81908 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("O2") #pragma GCC optimize ("unroll-loops") //#pragma GCC optimize("no-stack-protector,fast-math") using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<pii, int> piii; typedef pair<ll, ll> pll; #define debug(x) cerr<<#x<<'='<<(x)<<endl; #define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl; #define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl; #define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;} #define all(x) x.begin(), x.end() #define pb push_back #define kill(x) return cout<<x<<'\n', 0; const ld eps=1e-7; const int inf=1000000010; const ll INF=10000000000000010LL; const int mod=1000000007; const int MAXN=100010, LOG=20; ll n, m, k, u, v, x, y, t, a, b, ans; ll A[MAXN], ps[MAXN]; ll dp[2][MAXN]; int opt[201][MAXN]; vector<int> out; inline ll cost(ll l, ll r){ // (l, r] return (ps[r]-ps[l])*(ps[r]-ps[l]-1)/2; } void divide(int j, int tl, int tr, int optl, int optr){ if (tr<tl) return ; int mid=(tl+tr)>>1; for (int i=optl; i<=min(optr, mid-1); i++) if (dp[j&1^1][i]+cost(i, mid)<=dp[j&1][mid]){ dp[j&1][mid]=dp[j&1^1][i]+cost(i, mid); opt[j][mid]=i; } divide(j, tl, mid-1, optl, opt[j][mid]); divide(j, mid+1, tr, opt[j][mid], optr); } int main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); cin>>n>>k; for (int i=1; i<=n; i++) cin>>A[i], ps[i]=ps[i-1]+A[i]; for (int i=1; i<=n; i++) dp[0][i]=cost(0, i); for (int j=1; j<=k; j++){ memset(dp[j&1], 63, sizeof(dp[j&1])); divide(j, 1, n, 1, n); } int pos=n; for (int i=k; i; i--){ pos=opt[i][pos]; out.pb(pos); } reverse(all(out)); cout<<cost(0, n)-dp[k&1][n]<<'\n'; for (int i:out) cout<<i<<' ';cout<<'\n'; return 0; }

Compilation message (stderr)

sequence.cpp: In function 'void divide(int, int, int, int, int)':
sequence.cpp:39:53: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
  for (int i=optl; i<=min(optr, mid-1); i++) if (dp[j&1^1][i]+cost(i, mid)<=dp[j&1][mid]){
                                                    ~^~
sequence.cpp:40:20: warning: suggest parentheses around arithmetic in operand of '^' [-Wparentheses]
   dp[j&1][mid]=dp[j&1^1][i]+cost(i, mid);
                   ~^~
sequence.cpp: In function 'int main()':
sequence.cpp:66:2: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  for (int i:out) cout<<i<<' ';cout<<'\n';
  ^~~
sequence.cpp:66:31: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  for (int i:out) cout<<i<<' ';cout<<'\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...