제출 #446602

#제출 시각아이디문제언어결과실행 시간메모리
446602ArianKheirandishSailing Race (CEOI12_race)C++17
35 / 100
506 ms5072 KiB
//in the name of god//

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define _			ios_base::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define all(x)		x.begin(),x.end()
#define F			first
#define S			second
#define MP			make_pair

const int maxn = 500 + 10;
const int LG = 30;
const ll Inf = 1e9 + 10;
int n, k;
int dp[maxn][maxn][2][2];
vector <int> g[maxn];
bool c[maxn][maxn];

int Sol(int l, int r, int d, int x){
	int &ans = dp[l][r][d][x];
	if(ans != -1)
		return ans;
		
	ans = 0;
	if(l == r)
		return ans;
	
	int v = (!x ? l : r);
	if(!d){
		for(auto i : g[v])
			if(i > l && i < r)
				ans = max(ans, 1 + Sol(l, i, d, 1)),
				ans = max(ans, 1 + Sol(i, r, d, 0));
	}
	else{
		for (auto i : g[v])
			if (i < l)
				ans = max(ans, 1 + Sol(i, l, 0, 0)),
				ans = max(ans, 1 + Sol(i, r, d, 0));
			else if (i > r)
				ans = max(ans, 1 + Sol(l, i, d, 1)),
				ans = max(ans, 1 + Sol(r, i, !d, 1));
	}
	return ans;
}

int main(){_
	cin >> n >> k;
	for(int i = 1 ; i <= n ; i ++){
		while(true){
			int x;
			cin >> x;
			if(x == 0)
				break;
			g[i].push_back(x);
			c[i][x] = 1;
		}
	}
	
	int ans = 0, bst = 0;
	memset(dp, -1, sizeof dp);
	for(int l = 1 ; l <= n ; l ++)
		for(int r = l + 1 ; r <= n ; r ++){
			int a = Sol(l, r, 0, 0);
			int b = Sol(l, r, 1, 0);
			int C = Sol(l, r, 0, 1);
			int d = Sol(l, r, 1, 1);
			
			if(c[l][r] && 1 + C > ans)
				ans = 1 + C, bst = r;
			if(c[l][r] && 1 + d > ans)
				ans = 1 + d, bst = r;
			if(c[r][l] && 1 + a > ans)
				ans = 1 + a, bst = r;
			if(c[r][l] && 1 + b > ans)
				ans = 1 + b, bst = r;
		}
	cout << ans << '\n' << bst << '\n';
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...