Submission #159137

#TimeUsernameProblemLanguageResultExecution timeMemory
159137nafis_shifat수열 (APIO14_sequence)C++14
0 / 100
353 ms131076 KiB
#include<bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
using namespace std;
const ll inf=1e15;
int path[100000+10][200+10]={};
void print(int st,int k)
{
    if(path[st][k]==0)
    {
        cout<<st<<" ";
        return;
    }
    print(path[st][k],k-1);
    cout<<st<<" ";
}
int main()
{
	int n,k;
	cin>>n>>k;
	ll dp[n+10][k+10]={};

	
	ll a[n+5]={};
	ll cum1[n+5]={};
	ll cum2[n+5]={};
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		cum1[i]=cum1[i-1]+a[i];
	}
	for(int i=n;i>0;i--)cum2[i]=cum2[i+1]+a[i];
	for(int i=0;i<=n;i++)for(int j=0;j<=k;j++)dp[i][j]=0;

	
	for(int i=0;i<=n;i++)
	{
	    dp[i][0]=0;
	    dp[i][1]=cum1[i]*cum2[i+1];
	    path[i][1]=0;
	}
	
	
	for(int i=1;i<n;i++)
	{
		for(int j=2;j<=k && j<=i;j++)
		{
			int r=i-1;
			int l=j-1;
			int p=0;
			
			if(l==r)
			{
			    dp[i][j]=dp[i-1][j-1]+(cum1[i]-cum1[i-1])*cum2[i+1];
			    path[i][j]=i-1;
			   
			    continue;
			}
			while(r>=l)
			{
			    int mid1 = l+(r-l)/3;
                int mid2 = r-(r-l)/3;
                if(dp[mid1][j-1]+(cum1[i]-cum1[mid1])*cum2[i+1]>dp[mid2][j-1]+(cum1[i]-cum1[mid2])*cum2[i+1])
                {
                     r=mid2-1;
                     p=mid1;
                }
                else
                {
                    p=mid2;
                    l=mid1+1;
                }
			}
			//cout<<i<<" "<<j<<endl;
			
			
			dp[i][j]=dp[p][j-1]+(cum1[i]-cum1[p])*cum2[i+1];
			path[i][j]=p;
		
		}
	}
	ll mx=0,st;
	for(int i=1;i<=n;i++)
	{
	    if(dp[i][k]>mx)
	    {
	        mx=dp[i][k];
	        st=i;
	    }
	}

	
	cout<<mx<<endl;
	print(st,k);

	
	//for(int i=1;i<=10;i++)cout<<dp[i][3]+(cum1[11]-cum1[i])*cum2[12]<<" "<<dp[i][3]<<endl;

	return 0;
}

Compilation message (stderr)

sequence.cpp: In function 'int main()':
sequence.cpp:94:7: warning: 'st' may be used uninitialized in this function [-Wmaybe-uninitialized]
  print(st,k);
  ~~~~~^~~~~~
#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...