Submission #824192

#TimeUsernameProblemLanguageResultExecution timeMemory
824192vanicExam (eJOI20_exam)C++14
100 / 100
490 ms99520 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <stack>
#include <map>
#include <cstring>

using namespace std;

const int maxn=1e5+5;

int n;
int a[maxn], b[maxn];

void solve1(){
	int val=b[0];
	bool p=0;
	int prosl=-1;
	int br=0;
	for(int i=0; i<n; i++){
		if(a[i]==val && !p){
			br+=i-prosl;
			p=1;
		}
		else if(a[i]>val){
			prosl=i;
			p=0;
		}
		else if(p){
			br++;
		}
	}
	cout << br << '\n';
}

int l[maxn], r[maxn];
map < int, int > pos;
vector < int > lis;

void dodaj(int x){
	int ind=upper_bound(lis.begin(), lis.end(), x)-lis.begin();
	if(ind==(int)lis.size()){
		lis.push_back(x);
	}
	else{
		lis[ind]=x;
	}
}

void solve2(){
	stack < pair < int, int > > s;
	s.push({2e9, -1});
	for(int i=0; i<n; i++){
		pos[a[i]]=i;
		while(s.top().first<a[i]){
			s.pop();
		}
		l[i]=s.top().second+1;
		s.push({a[i], i});
	}
	while(!s.empty()){
		s.pop();
	}
	s.push({2e9, n});
	for(int i=n-1; i>-1; i--){
		while(s.top().first<a[i]){
			s.pop();
		}
		r[i]=s.top().second-1;
		s.push({a[i], i});
	}
	for(int i=0; i<n; i++){
		if(pos.find(b[i])!=pos.end() && i>=l[pos[b[i]]] && i<=r[pos[b[i]]]){
			dodaj(pos[b[i]]);
		}
	}
	cout << lis.size() << '\n';
}


int dp[5005][5005];

int rek(int x, int y){
	if(x==-1 || y==-1){
		return 0;
	}
	if(dp[x][y]!=-1){
		return dp[x][y];
	}
	if(a[x]==b[y] && l[x]<=y && r[x]>=y){
		return dp[x][y]=max(rek(x-1, y), rek(x, y-1)+1);
	}
	else{
		return dp[x][y]=max(rek(x-1, y), rek(x, y-1));
	}
}

void solve3(){
	memset(dp, -1, sizeof(dp));
	stack < pair < int, int > > s;
	s.push({2e9, -1});
	for(int i=0; i<n; i++){
		while(s.top().first<a[i]){
			s.pop();
		}
		l[i]=s.top().second+1;
		s.push({a[i], i});
	}
	while(!s.empty()){
		s.pop();
	}
	s.push({2e9, n});
	for(int i=n-1; i>-1; i--){
		while(s.top().first<a[i]){
			s.pop();
		}
		r[i]=s.top().second-1;
		s.push({a[i], i});
	}
	cout << rek(n-1, n-1) << '\n';
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	set < int > s;
	for(int i=0; i<n; i++){
		cin >> a[i];
		s.insert(a[i]);
	}
	bool p=1;
	for(int i=0; i<n; i++){
		cin >> b[i];
		if(i && b[i]!=b[i-1]){
			p=0;
		}
	}
	if(p){
		solve1();
	}
	else if((int)s.size()==n){
		solve2();
	}
	else{
		solve3();
	}
	return 0;
}
#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...