답안 #463411

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
463411 2021-08-11T06:10:55 Z amunduzbaev Exam (eJOI20_exam) C++14
12 / 100
40 ms 1116 KB
#include "bits/stdc++.h"
using namespace std;
 
//~ #define int long long
 
void solve1(int n, vector<int>& a, vector<int>& b){
	vector<int> dp(n);
	int res = 0;
	if(n <= 205){
		int res = 0;
		for(int i=0;i<n;i++){
			int s = i;
			while(s + 1 < n && a[s + 1] <= a[i]) s++;
			vector<int> cnt(n);
			for(int j=0;j<n;j++){
				if(j) cnt[j] = cnt[j-1];
				cnt[j] += (b[j] == a[i]);
			}
			for(int r=s;r>=0;r--){
				if(a[r] > a[i]) break;
				int mx = 0;
				for(int l=r;l>=0;l--){
					if(a[l] > a[i]) break;
					mx = max(mx, (l ? - cnt[l-1] + dp[l-1] : 0));
				}
				
				dp[r] = max(dp[r], cnt[r] + mx);
			}
		}
 
		for(int i=0;i<n;i++) res = max(res, dp[i]);
	} else {
		for(int i=0;i<n;i++){
			int r = i, l = i;
			while(r + 1 < n && a[r + 1] <= a[i]) r++;
			while(l > 0 && a[l - 1] <= a[l]) l--;
			vector<int> cnt(n), pref(n);
			for(int j=0;j<n;j++){
				if(j) cnt[j] = cnt[j-1];
				cnt[j] += (b[j] == a[i]);
			}
 
			for(int i=l;i<=r;i++){
				if(i) pref[i] = pref[i-1];
				pref[i] = max(pref[i], (i ? dp[i - 1] - cnt[i - 1] : 0));
			}
 
			for(int j=l;j<=r;j++){
				dp[j] = max(dp[j], cnt[j] + pref[j]);
			}
		}
 
		for(int i=0;i<n;i++) res = max(res, dp[i]);
	}
	
	cout<<res<<"\n";
}
 
void solve2(int n, vector<int>& a, vector<int>& b){
	int last = 0, cnt = 0, res = 0;
	for(int i=0;i<n;i++){
		if(a[i] > b[0]){
			if(cnt){
				res += (i - last);
			}
			
			cnt = 0, last = i + 1;
		} else {
			cnt |= (a[i] == b[i]);
		}
	} if(cnt){
		res += (n - last);
	}
	
	cout<<res<<"\n";
}
 
void solve(){
	int n; cin>>n;
	vector<int> a(n), b(n);
	for(auto& x : a) cin>>x;
	for(auto& x : b) cin>>x;
	
	int mx = 0, mn = 1e9;
	for(auto x : b) mx = max(mx, x), mn = min(mn, x);
	if(mx == mn){
		solve2(n, a, b);
		return;
	}
	
	if(n <= 5005){
		solve1(n, a, b);
	} else {
		solve2(n, a, b);
	}
}
 
/*
 
3
1 2 3
2 2 2
 
*/
 
signed main(){
	ios_base::sync_with_stdio(0); cin.tie(0);
	int t = 1;
	//~ cin>>t;
	while(t--) solve();
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 5 ms 432 KB Output is correct
3 Correct 22 ms 1028 KB Output is correct
4 Correct 15 ms 1116 KB Output is correct
5 Correct 28 ms 1100 KB Output is correct
6 Correct 15 ms 1116 KB Output is correct
7 Correct 15 ms 1112 KB Output is correct
8 Correct 31 ms 1104 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 40 ms 408 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -