답안 #463405

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
463405 2021-08-11T05:56:42 Z amunduzbaev Exam (eJOI20_exam) C++14
12 / 100
30 ms 1108 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);
	if(n > 205){
		int res = 0;
		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=l;j<=r;j++){
				 if(b[j] == a[i]) cnt[j]++;
				 if(j + 1 < n) cnt[j+1] = cnt[j];
			}

			for(int i=l;i<=r;i++){
				pref[i] = max(pref[i], (i ? dp[i - 1] - cnt[i - 1] : 0));
				if(i + 1 < n) pref[i+1] = pref[i];
			}

			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";
		return;
	}
	vector<array<int, 3>> tmp;
	for(int i=0;i<n;i++){
		tmp.push_back({a[i], 0, i});
		tmp.push_back({b[i], 1, i});
	}
	
	sort(tmp.begin(), tmp.end());
	for(int last=0, i=0;i<(int)tmp.size();){
		int j = i;
		while(j < (int)tmp.size() && tmp[j][0] == tmp[i][0]) j++;
		while(i < j){
			if(tmp[i][1]){
				b[tmp[i][2]] = last;
			} else {
				a[tmp[i][2]] = last;
			} i++; 
		} last++;
	}

	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++){
			cnt[j] += (b[j] == a[i]);
			if(j + 1 < n) cnt[j+1] = cnt[j];
		}
		
		for(int r=s;r>=0;r--){
			if(a[r] > a[i]) break;
			for(int l=r;l>=0;l--){
				if(a[l] > a[i]) break;
				dp[r] = max(dp[r], cnt[r] - (l ? cnt[l-1] - dp[l-1] : 0));
			}
		}
	}

	for(int i=0;i<n;i++) res = max(res, dp[i]);
	cout<<res<<"\n";
	int r1, r2;
	r1 = res;
	
	if(1){
		int res = 0;
		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=l;j<=r;j++){
				 if(b[j] == a[i]) cnt[j]++;
				 if(j + 1 < n) cnt[j+1] = cnt[j];
			}

			for(int i=l;i<=r;i++){
				pref[i] = max(pref[i], (i ? dp[i - 1] - cnt[i - 1] : 0));
				if(i + 1 < n) pref[i+1] = pref[i];
			}

			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";
		r2 = res;
	}
	
	assert(r1 >= r2);
}

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 Correct 0 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Runtime error 1 ms 460 KB Execution killed with signal 6
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 6 ms 376 KB Output is correct
3 Correct 18 ms 1032 KB Output is correct
4 Correct 15 ms 1100 KB Output is correct
5 Correct 30 ms 1100 KB Output is correct
6 Correct 16 ms 972 KB Output is correct
7 Correct 15 ms 1108 KB Output is correct
8 Correct 28 ms 1100 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1 ms 460 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 12 ms 332 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Runtime error 1 ms 460 KB Execution killed with signal 6
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
3 Correct 0 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Runtime error 1 ms 460 KB Execution killed with signal 6
6 Halted 0 ms 0 KB -