166562025-05-07 18:29:09szilMaximum felosztáscpp17Time limit exceeded 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;
}
SubtaskSumTestVerdictTimeMemory
subtask10/0
1Accepted3ms2704 KiB
2Accepted6ms3128 KiB
subtask210/10
3Accepted3ms2616 KiB
4Accepted3ms2612 KiB
5Accepted3ms2796 KiB
6Accepted3ms2612 KiB
7Accepted3ms2612 KiB
8Accepted3ms2612 KiB
subtask315/15
9Accepted4ms2868 KiB
10Accepted3ms2696 KiB
11Accepted3ms2868 KiB
12Accepted4ms2828 KiB
13Accepted3ms2752 KiB
14Accepted3ms2612 KiB
15Accepted3ms2612 KiB
16Accepted12ms4612 KiB
17Accepted3ms2612 KiB
18Accepted7ms3608 KiB
subtask415/15
19Accepted4ms3064 KiB
20Accepted6ms3124 KiB
21Accepted6ms2904 KiB
22Accepted4ms2868 KiB
23Accepted3ms2868 KiB
24Accepted4ms3052 KiB
25Accepted4ms2868 KiB
26Accepted4ms2868 KiB
27Accepted240ms31844 KiB
28Accepted4ms2868 KiB
29Accepted6ms3124 KiB
30Accepted4ms2620 KiB
31Accepted26ms6528 KiB
32Accepted3ms2868 KiB
33Accepted122ms16876 KiB
34Accepted4ms2868 KiB
35Accepted75ms12416 KiB
36Accepted4ms2876 KiB
37Accepted17ms4728 KiB
38Accepted4ms2872 KiB
subtask50/60
39Time limit exceeded1.082s21660 KiB
40Accepted458ms33936 KiB
41Accepted483ms39712 KiB
42Accepted384ms42472 KiB
43Accepted379ms41360 KiB
44Accepted245ms18080 KiB
45Accepted144ms28980 KiB
46Accepted919ms32068 KiB
47Accepted893ms29020 KiB
48Time limit exceeded1.003s37288 KiB
49Time limit exceeded1.011s32592 KiB
50Accepted966ms39080 KiB
51Accepted104ms21148 KiB
52Accepted64ms12560 KiB
53Accepted64ms11164 KiB
54Accepted54ms11940 KiB
55Accepted50ms8848 KiB
56Accepted811ms18020 KiB
57Accepted880ms20960 KiB
58Time limit exceeded1.093s84836 KiB
59Accepted705ms6756 KiB
60Time limit exceeded1.09s85376 KiB
61Accepted32ms5172 KiB
62Time limit exceeded1.09s78692 KiB
63Accepted757ms8948 KiB
64Time limit exceeded1.095s76384 KiB
65Accepted751ms9320 KiB
66Time limit exceeded1.093s78692 KiB
67Accepted699ms7008 KiB
68Time limit exceeded1.092s81516 KiB
69Accepted736ms7780 KiB
70Time limit exceeded1.093s67088 KiB
71Accepted199ms9268 KiB