#include<bits/stdc++.h>
using namespace std;
int n, k;
bool check(int i, int j, int dir, int x){
if(i == j){
if(dir == 1) return false;
if(dir == 0) return true;
}
if(dir == 1) swap(i, j);
if(i < j && i < x && x < j) return true;
if(j < i && (i < x || x < j)) return true;
return false;
}
int main(){
cin >> n >> k;
vector<vector<int>> g(n);
for(int i = 0; i < n; i++){
while(true){
int x;
cin >> x;
if(x == 0) break;
g[i].push_back(x - 1);
}
}
vector<vector<array<int, 2>>> dp(n, vector<array<int, 2>>(n, {0, 0})); //iben j-ig max, 0 -> ibol jobbra, 1-> ibol balra
for(int l = 1; l <= n; l++){
for(int i = 0; i < n; i++){
int j = (i + l) % n;
int j2 = (i - l + n) % n;
for(auto x : g[i]){
if(check(i, j, 0, x)){
dp[i][j][0] = max(dp[i][j][0], max(dp[x][i][1], dp[x][j][0]) + 1);
}
if(check(i, j2, 1, x)){
dp[i][j2][1] = max(dp[i][j2][1], max(dp[x][i][0], dp[x][j2][1]) + 1);
}
}
}
}
array<int, 2> maxi = {-1, 0};
for(int i = 0; i < n; i++) maxi = max(maxi, {dp[i][i][0], i});
for(int i = 0; i < n; i++) maxi = max(maxi, {dp[i][i][1], i});
cout << maxi[0] << "\n" << maxi[1] << "\n";
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |