166552025-05-07 18:28:38algoproMaximum felosztáscpp17Runtime error 0/1001.105s79204 KiB
// UUID: 5a4b713c-5905-44f0-992b-1e1f0cbd5c00
#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.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;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms2612 KiB
2Runtime error3ms3052 KiB
subtask20/10
3Accepted3ms2612 KiB
4Runtime error3ms2804 KiB
5Accepted4ms2612 KiB
6Accepted3ms2612 KiB
7Runtime error3ms2668 KiB
8Accepted3ms2828 KiB
subtask30/15
9Runtime error4ms2868 KiB
10Runtime error4ms2720 KiB
11Accepted3ms2868 KiB
12Accepted3ms2624 KiB
13Runtime error3ms2880 KiB
14Runtime error3ms2800 KiB
15Accepted4ms2804 KiB
16Accepted13ms4660 KiB
17Runtime error3ms2868 KiB
18Accepted7ms3424 KiB
subtask40/15
19Runtime error4ms2880 KiB
20Runtime error4ms2868 KiB
21Runtime error3ms2868 KiB
22Accepted4ms2868 KiB
23Runtime error3ms2612 KiB
24Accepted4ms2880 KiB
25Runtime error3ms2868 KiB
26Runtime error3ms2768 KiB
27Runtime error3ms2972 KiB
28Runtime error4ms2868 KiB
29Accepted6ms3124 KiB
30Accepted4ms2612 KiB
31Accepted28ms6604 KiB
32Accepted4ms2872 KiB
33Accepted128ms16984 KiB
34Accepted4ms2868 KiB
35Accepted72ms12312 KiB
36Runtime error3ms2868 KiB
37Accepted17ms4744 KiB
38Runtime error3ms2868 KiB
subtask50/60
39Time limit exceeded1.09s21148 KiB
40Runtime error23ms4660 KiB
41Accepted474ms39684 KiB
42Accepted368ms42476 KiB
43Accepted382ms41360 KiB
44Runtime error19ms4148 KiB
45Runtime error17ms3636 KiB
46Accepted902ms32080 KiB
47Runtime error32ms6212 KiB
48Accepted967ms37104 KiB
49Runtime error32ms6176 KiB
50Time limit exceeded1.006s38968 KiB
51Accepted109ms21248 KiB
52Accepted67ms12560 KiB
53Runtime error17ms3384 KiB
54Accepted56ms12088 KiB
55Accepted50ms8872 KiB
56Accepted837ms18016 KiB
57Accepted797ms21028 KiB
58Runtime error29ms6244 KiB
59Runtime error28ms6244 KiB
60Runtime error17ms3480 KiB
61Runtime error17ms3588 KiB
62Runtime error28ms6252 KiB
63Accepted700ms9080 KiB
64Time limit exceeded1.105s77676 KiB
65Accepted649ms9316 KiB
66Runtime error29ms6244 KiB
67Runtime error29ms6244 KiB
68Time limit exceeded1.088s79204 KiB
69Accepted694ms7840 KiB
70Time limit exceeded1.105s68392 KiB
71Accepted197ms9068 KiB