Submission #839947

#TimeUsernameProblemLanguageResultExecution timeMemory
839947zscoderSoccer Stadium (IOI23_soccer)C++17
64 / 100
800 ms767780 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
 
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef long double ld; 
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;
typedef bitset<500> b100;

int a[2011][2011];
int dp[511][511][511];
ii iv[2011][2011];
int L[511][511][511];
int R[511][511][511];

int intersect(ii a, ii b)
{
	int l=max(a.fi,b.fi); int r=min(a.se,b.se);
	return max(0,r-l+1);
}

int biggest_stadium(int n, vector<vector<int> > F)
{
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			a[i][j]=F[i][j]; a[i][j]=1-a[i][j];
		}
	}
	for(int i=0;i<n;i++)
	{
		vector<ii> intervals;
		int st=-1;
		for(int j=0;j<n+1;j++)
		{
			if(a[i][j])
			{
				if(st==-1)
				{
					st=j;
				}
				//else st continues;
			}
			else
			{
				iv[i][j]={-1,-1};
				if(st!=-1)
				{
					intervals.pb({st,j-1});
					for(int k=st;k<j;k++)
					{
						iv[i][k]={st,j-1};
					}
					st=-1;
				}
			}
		}
	}
	int ans=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			L[i][i][j]=(iv[i][j].fi==-1?int(1e9):iv[i][j].fi);
			R[i][i][j]=iv[i][j].se;
			dp[i][i][j]=max(R[i][i][j]-L[i][i][j]+1,0);
			ans=max(ans,dp[i][i][j]);
			//cerr<<i<<' '<<j<<' '<<L[i][i][j]<<' '<<R[i][i][j]<<' '<<dp[i][i][j]<<'\n';
		}
	}
	
	for(int len=2;len<=n;len++)
	{
		for(int l=0;l+len-1<n;l++)
		{
			int r=l+len-1;
			for(int j=0;j<n;j++)
			{
				int l1 = max(L[l+1][r][j],iv[l][j].fi);
				int l2 = max(L[l][r-1][j],iv[r][j].fi);
				L[l][r][j]=min(l1,l2);
				int r1 = min(R[l+1][r][j],iv[l][j].se);
				int r2 = min(R[l][r-1][j],iv[r][j].se);
				R[l][r][j]=max(r1,r2);
				dp[l][r][j]=max(dp[l+1][r][j]+intersect({L[l+1][r][j],R[l+1][r][j]},{L[l][l][j],R[l][l][j]}),
								dp[l][r-1][j]+intersect({L[l][r-1][j],R[l][r-1][j]},{L[r][r][j],R[r][r][j]}));
				ans=max(ans,dp[l][r][j]);
			}
			//L[l][r][
		}
	}
	return ans;
}
/*
int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	int n; cin>>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...
#Verdict Execution timeMemoryGrader output
Fetching results...