This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(random_device{}());
const ll mod=1000000007;
const ll mod2=998244353;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
const int N=101000;
int n,k,a[N],go[N][201];
ll pf[N],dp[N][2];
void gao(int l,int r,int pl,int pr,int x) {
if (l>r) return;
int md=(l+r)>>1;
ll bst=-1e17;
int j=0;
rep(i,pl,min(pr,md)+1) {
if (bst<dp[i-1][(x&1)^1]+(pf[md]-pf[i-1])*pf[i-1]) {
bst=dp[i-1][(x&1)^1]+(pf[md]-pf[i-1])*pf[i-1];
j=i;
}
}
go[md][x]=j;
dp[md][x&1]=bst;
gao(l,md-1,pl,j,x);
gao(md+1,r,j,pr,x);
}
int main() {
scanf("%d%d",&n,&k);
k++;
rep(i,1,n+1) scanf("%d",a+i);
rep(i,1,n+1) pf[i]=pf[i-1]+a[i],dp[i][0]=-1e17;
rep(i,1,k+1) gao(i,n,i,n,i);
printf("%lld\n",dp[n][k&1]);
VI ans;
int pos=n;
while (pos>0) ans.pb(pos),pos=go[pos][k--]-1;
reverse(all(ans));
rep(i,0,SZ(ans)-1) printf("%d ",ans[i]); puts("");
}
/*7 3
4 1 3 4 0 2 3
*/
Compilation message (stderr)
sequence.cpp: In function 'int main()':
sequence.cpp:3:20: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
3 | #define rep(i,a,n) for (int i=a;i<n;i++)
| ^~~
sequence.cpp:55:2: note: in expansion of macro 'rep'
55 | rep(i,0,SZ(ans)-1) printf("%d ",ans[i]); puts("");
| ^~~
sequence.cpp:55:43: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
55 | rep(i,0,SZ(ans)-1) printf("%d ",ans[i]); puts("");
| ^~~~
sequence.cpp:45:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
45 | scanf("%d%d",&n,&k);
| ~~~~~^~~~~~~~~~~~~~
sequence.cpp:47:20: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
47 | rep(i,1,n+1) scanf("%d",a+i);
| ~~~~~^~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |