166562025-05-07 18:29:09szilMaximum felosztáscpp17Időlimit túllépés 40/1001.095s85376 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;

const int MAXN = 100'001;
const ll INF = 1e15;
const ll MOD = 1e9+7;

ll a[MAXN], b[MAXN];
vector<pair<ll, ll>> pref[MAXN];
map<ll, ll> value_to_bidx;

void solve() {
    int n, m; cin >> n >> m;
    a[0] = INF;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= m; i++) cin >> b[i];
    for (int i = 1; i <= m; i++) {
        value_to_bidx[b[i]] = i;
    }

    vector<ll> st;
    vector<pair<ll, ll>> todo;
    st.emplace_back(0);
    pref[0].emplace_back(0, 1);
    for (int i = 1; i <= m; i++) {
        pref[i].emplace_back(0, 0);
    }
    for (int i = 1; i <= n; i++) {
        
        vector<ll> dp(m+1);
        while (!st.empty() && a[st.back()] <= a[i]) {
            if (!todo.empty() && todo.back().second == st.back()) todo.pop_back();
            st.pop_back();
        }
        if (value_to_bidx.count(a[i])) todo.emplace_back(st.back()+1, i);
        st.emplace_back(i);
        
        for (auto [l, r] : todo) {
            ll idx = value_to_bidx[a[r]];
            
            auto it1 = upper_bound(pref[idx-1].begin(), pref[idx-1].end(), make_pair(r-1, INF));
            auto it2 = lower_bound(pref[idx-1].begin(), pref[idx-1].end(), make_pair(l-1, 0ll));

            ll val1 = 0;
            ll val2 = 0;
            if (it1 != pref[idx-1].begin()) {
                it1--;
                val1 = it1->second;
            }
            if (it2 != pref[idx-1].begin()) {
                it2--;
                val2 = it2->second;
            }
            ll res = val1 - val2;
            res %= MOD;
            
            if (i == n && idx == m) {
                cout << res << "\n";
                return;
            } else {
                pref[idx].emplace_back(i, pref[idx].back().second + res);
            }
        }
    }

    cout << "0\n";
}

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1; 
    // cin >> t;
    while (t--) solve();
    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2704 KiB
2Elfogadva6ms3128 KiB
subtask210/10
3Elfogadva3ms2616 KiB
4Elfogadva3ms2612 KiB
5Elfogadva3ms2796 KiB
6Elfogadva3ms2612 KiB
7Elfogadva3ms2612 KiB
8Elfogadva3ms2612 KiB
subtask315/15
9Elfogadva4ms2868 KiB
10Elfogadva3ms2696 KiB
11Elfogadva3ms2868 KiB
12Elfogadva4ms2828 KiB
13Elfogadva3ms2752 KiB
14Elfogadva3ms2612 KiB
15Elfogadva3ms2612 KiB
16Elfogadva12ms4612 KiB
17Elfogadva3ms2612 KiB
18Elfogadva7ms3608 KiB
subtask415/15
19Elfogadva4ms3064 KiB
20Elfogadva6ms3124 KiB
21Elfogadva6ms2904 KiB
22Elfogadva4ms2868 KiB
23Elfogadva3ms2868 KiB
24Elfogadva4ms3052 KiB
25Elfogadva4ms2868 KiB
26Elfogadva4ms2868 KiB
27Elfogadva240ms31844 KiB
28Elfogadva4ms2868 KiB
29Elfogadva6ms3124 KiB
30Elfogadva4ms2620 KiB
31Elfogadva26ms6528 KiB
32Elfogadva3ms2868 KiB
33Elfogadva122ms16876 KiB
34Elfogadva4ms2868 KiB
35Elfogadva75ms12416 KiB
36Elfogadva4ms2876 KiB
37Elfogadva17ms4728 KiB
38Elfogadva4ms2872 KiB
subtask50/60
39Időlimit túllépés1.082s21660 KiB
40Elfogadva458ms33936 KiB
41Elfogadva483ms39712 KiB
42Elfogadva384ms42472 KiB
43Elfogadva379ms41360 KiB
44Elfogadva245ms18080 KiB
45Elfogadva144ms28980 KiB
46Elfogadva919ms32068 KiB
47Elfogadva893ms29020 KiB
48Időlimit túllépés1.003s37288 KiB
49Időlimit túllépés1.011s32592 KiB
50Elfogadva966ms39080 KiB
51Elfogadva104ms21148 KiB
52Elfogadva64ms12560 KiB
53Elfogadva64ms11164 KiB
54Elfogadva54ms11940 KiB
55Elfogadva50ms8848 KiB
56Elfogadva811ms18020 KiB
57Elfogadva880ms20960 KiB
58Időlimit túllépés1.093s84836 KiB
59Elfogadva705ms6756 KiB
60Időlimit túllépés1.09s85376 KiB
61Elfogadva32ms5172 KiB
62Időlimit túllépés1.09s78692 KiB
63Elfogadva757ms8948 KiB
64Időlimit túllépés1.095s76384 KiB
65Elfogadva751ms9320 KiB
66Időlimit túllépés1.093s78692 KiB
67Elfogadva699ms7008 KiB
68Időlimit túllépés1.092s81516 KiB
69Elfogadva736ms7780 KiB
70Időlimit túllépés1.093s67088 KiB
71Elfogadva199ms9268 KiB