Submission #1312422

#TimeUsernameProblemLanguageResultExecution timeMemory
1312422neonglitchGroup Photo (JOI21_ho_t3)C++20
64 / 100
5070 ms195988 KiB
#include <iostream>
using namespace std;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int n;
	cin>>n;
	int a[n+1],pos[n+1]={0};
	for(int i=1;i<=n;i++)cin>>a[i],pos[a[i]]=i;
	int dp[n+1]={0};
	int left[n+1][n+1]={0};
	int cst[n+1][n+1]={0};
	int pre[n+2]={0};
	int ppre[n+2]={0};
	for(int i=0;i<=n;i++)
	{
		for(int j=0;j<=n;j++)
		{
			left[i][j]=1;
			cst[i][j]=0;
		}
	}
	for(int i=0;i<=n;i++)dp[i]=1e9;
		dp[0]=0;
	for(int l=1;l<=n;l++)
	{
		cst[l][l]=1;
		for(int r=l+1;r<=n;r++)
		{
			cst[l][r]=cst[l][r-1];
			for(int p=l;p<=r;p++)
			{
				cst[l][r]+=(pos[r]<=pos[p]);
			}
		}
	}
	for(int i=0;i<=n;i++)
	{
		// length of suffix fixed
		// cout<<"For "<<i<<' '<<dp[i]<<endl;
		for(int j=0;j<=n;j++)pre[j]=left[i][j];
		for(int j=n-1;j>=0;j--)pre[j]+=pre[j+1];
		for(int j=0;j<=n;j++)ppre[j]=pre[pos[j]];
		for(int j=1;j<=n;j++)ppre[j]+=ppre[j-1];
		for(int p=1;p<=n-i;p++)
		{
			int fe=n-i,le=p;
			int sm=dp[i];

			sm+=ppre[fe]-ppre[le-1]-cst[le][fe];

			if(sm<dp[n-p+1])
			{
				dp[n-p+1]=sm;
				for(int j=0;j<=n;j++)
				{
					if(p<=a[j] and a[j]<=n-i)
					{
						left[n-p+1][j]=0;
					}
					else{
						left[n-p+1][j]=left[i][j];
					}
				}
			}
		}
	}
	cout<<dp[n]<<endl;
	
}
#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...