# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
467583 | mtxas | Exam (eJOI20_exam) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define fi first
#define se second
#define pll pair<ll, ll>
#define mii map<int, int>
#define vi vector<int>
#define vll vector<ll>
#define pb push_back
#define all(a) a.begin(), a.end()
#define sz(x) ((int)x.size())
#define turbo() cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(false)
#define _fre() freopen("input.txt", "r", stdin)
#define _for(a, b, c) for(int (a) = (b); (a) < (c); (a)++)
#define _foreq(a, b, c) for(int (a) = (b); (a) <= (c); (a)++)
#define _forneq(a, b, c) for(int (a) = (b); (a) >= (c); (a)--)
#define _forn(a, b, c) for(int (a) = (b); (a) > (c); (a)--)
using namespace std;
#define int ll
#define _min(a, b) a = min(a, b)
#define _max(a, b) a = max(a, b)
/***********************************************************************************
STRUCTS
************************************************************************************/
/***********************************************************************************
VARIABLES
************************************************************************************/
const int maxn = 1e5+2;
int n;
int a[maxn], b[maxn];
/***********************************************************************************
FUNCTIONS
************************************************************************************/
int pass(int l, int r){
int mx = 0;
_foreq(i, l, r) mx = max(mx, a[i]);
int ans = 0;
_foreq(i, l, r) ans += (mx == b[i]);
return ans;
}
bool subtask2(){
bool yes = 1;
_foreq(i, 2, n) yes &= (b[i] == b[i-1]);
return yes;
}
bool subtask3(){
_foreq(i, 2, n)
if(a[i-1] >= a[i]) return false;
return true;
}
int solve2(){
int B = b[1]; a[n+1] = B+1;
bool exists = 0;
_foreq(i, 1, n) exists |= (a[i] == B);
if(!exists){cout<<0; return 0;}
int ans = 0;
int start = 1; bool haveB = 0;
_foreq(i, 1, n+1){
if(a[i] > B) {
if(haveB) ans += i-start;
haveB = 0;
start = i+1;
}
else if(a[i] == B) haveB = 1;
}
return ans;
}
int solve3(){
vector<vi> dp(n+1, vi(n+1, 0));
_foreq(i, 1, n){
int mx = dp[i-1][i-1];
_foreq(j, i, n){
MyMax(mx, dp[i-1][j]);
dp[i][j] = mx + (b[i] == a[j]);
}
}
return dp[n][n];
}
void readInput(){
cin>>n; _foreq(i, 1,n) cin>>a[i]; _foreq(i, 1, n) cin>>b[i];
}
/***********************************************************************************
MAIN
************************************************************************************/
signed main(){
// _fre();
turbo();
readInput();
if(subtask2()) cout<<solve2();
else if(subtask3()) cout<<solve3();
}