Submission #1326995

#TimeUsernameProblemLanguageResultExecution timeMemory
1326995yeulerExam (eJOI20_exam)C++20
0 / 100
1 ms1848 KiB
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define eb push_back
#define fi first
#define se second
#define vector2d(x) vector<vector<x>>
#define pii pair<int, int>
#define pl pair<ll, ll>
#define kagamine_len ios_base::sync_with_stdio(0); cin.tie(0);
#define file_in freopen("input.txt", "r", stdin);
#define file_out freopen("output.txt", "w", stdout);
#define all(x) x.begin(), x.end()

using namespace std;

/*

g++ -std=c++20 EJOI2020_Exam.cpp -o output/EJOI2020_Exam.exe
./output/EJOI2020_Exam.exe

Input
N -> banyak murid yg mengikuti ujian
A1 .. AN -> skor yg akan mrk dapat
B1 .. BN -> skor buat lulus hrs exactly Bi

dp[l][r][0] = jumlah maksimum murid yg lulus rentang nyontek beda
dp[l][r][1] = jumlah maksimum murid yg lulus rentang nyontek sama
for subtask 1, 5 (30 points)

tandain kl lebih besar dr anu gbs
abis itu tiap segment di-max-in aja
for subtask 2 (12 points) - secured



*/

ll n;
vector<ll> a(1e5+1), b(1e5+1);

void subtask_2(){
    // ll n; cin >> n;
    vector<ll> seg(n+2, 0);

    // for (ll i = 1; i <= n; i++) cin >> a[i];
    // for (ll i = 1; i <= n; i++) cin >> b[i];

    vector<bool> mark(n+2, 0);
    vector<ll> idx;
    ll ma = 0;
    for (ll i = 1; i <= n; i++){
        if (a[i] > b[i]){
            mark[i] = 1;
            ma = 0;
            idx.pb(i);
            continue;
        }
        ma = max(a[i], ma);
        seg[i] = ma;
    }
    idx.pb(n+1);

    ll bef = 0;
    for (ll j : idx){
        ll mx = seg[j-1];
        for (ll i = j-1; i > bef; i--){
            seg[i] = mx;
        }
        bef = j;
    }

    ll ans = 0;
    for (ll i = 1; i <= n; i++){
        if (seg[i] == b[i]) ans++;
        // cout << seg[i] << " ";
    }
    // cout << "\n";

    cout << ans << "\n";
}

void solve(){
    // ll n; cin >> n;
    vector<ll> a(n+1), b(n+1);
    vector2d(ll) dp(n+1, vector<ll>(n+1, 0)), pf(n+1, vector<ll>(n+1, 0));

    for (ll i = 1; i <= n; i++) cin >> a[i];
    for (ll i = 1; i <= n; i++) cin >> b[i];

    for (ll i = 1; i <= n; i++){
        pf[i][i] = a[i];
        for (ll j = i+1; j <= n; j++){
            pf[i][j] = max(pf[i][j-1], a[j]);
        }
    }

    for (ll len = 1; len <= n; len++){
        for (ll l = 1; (l+len-1) <= n; l++){
            ll r = l+len-1;
            if (l == r){
                dp[l][r] = (a[l] == b[l]);
                continue;
            }

            for (ll mid = l; mid < r; mid++){
                dp[l][r] = max(dp[l][r], dp[l][mid]+dp[mid+1][r]);
            }

            ll ma = pf[l][r], cnt = 0;
            for (ll i = l; i <= r; i++){
                if (ma == b[i]) cnt++;
            }

            dp[l][r] = max(dp[l][r], cnt);
        }
    }

    ll ans = dp[1][n];

    cout << ans << "\n";
}

/*

14
1 2 6 4 1 1 5 7 4 9 2 4 3 2
4 4 4 4 4 4 4 4 4 4 4 4 4 4

should be 8

*/


int main(){
    kagamine_len

    int tc = 1;
    // cin >> tc;
    while (tc --> 0){
        solve();
    }
    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...