166532025-05-07 18:22:58algoproMaximum felosztáscpp17Time limit exceeded 40/1001.093s75424 KiB
// UUID: 8402b3bd-584d-4d49-88ca-e88ea36885db
#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<int> st;
    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]) st.pop_back();
        st.emplace_back(i);
        
        for (int j = st.size()-1; j >= 1; j--) {
            if (value_to_bidx.count(a[st[j]])) {
                ll idx = value_to_bidx[a[st[j]]];
                
                ll l = st[j-1]+1, r = st[j];
                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
2Accepted6ms3128 KiB
subtask210/10
3Accepted3ms2612 KiB
4Accepted3ms2612 KiB
5Accepted3ms2612 KiB
6Accepted3ms2612 KiB
7Accepted3ms2612 KiB
8Accepted3ms2612 KiB
subtask315/15
9Accepted3ms2868 KiB
10Accepted3ms2612 KiB
11Accepted3ms2868 KiB
12Accepted4ms2868 KiB
13Accepted3ms2612 KiB
14Accepted3ms2612 KiB
15Accepted4ms2612 KiB
16Accepted18ms4660 KiB
17Accepted3ms2804 KiB
18Accepted8ms3608 KiB
subtask415/15
19Accepted6ms3176 KiB
20Accepted6ms3124 KiB
21Accepted4ms2872 KiB
22Accepted4ms2868 KiB
23Accepted4ms2832 KiB
24Accepted4ms2784 KiB
25Accepted6ms2900 KiB
26Accepted4ms2868 KiB
27Accepted421ms32092 KiB
28Accepted6ms2900 KiB
29Accepted6ms3020 KiB
30Accepted4ms2612 KiB
31Accepted43ms6628 KiB
32Accepted4ms2868 KiB
33Accepted182ms17104 KiB
34Accepted4ms2744 KiB
35Accepted149ms12340 KiB
36Accepted4ms2868 KiB
37Accepted19ms5100 KiB
38Accepted4ms2868 KiB
subtask50/60
39Time limit exceeded1.085s22760 KiB
40Accepted488ms34964 KiB
41Accepted560ms40588 KiB
42Accepted402ms43372 KiB
43Accepted395ms42128 KiB
44Accepted287ms19104 KiB
45Accepted173ms29712 KiB
46Accepted987ms33260 KiB
47Accepted949ms30044 KiB
48Time limit exceeded1.021s38428 KiB
49Time limit exceeded1.085s33516 KiB
50Accepted995ms40152 KiB
51Accepted119ms21912 KiB
52Accepted74ms12492 KiB
53Accepted70ms11028 KiB
54Accepted59ms12136 KiB
55Accepted54ms8772 KiB
56Accepted838ms19208 KiB
57Accepted903ms22116 KiB
58Time limit exceeded1.093s48988 KiB
59Accepted685ms7784 KiB
60Time limit exceeded1.085s75424 KiB
61Accepted32ms5172 KiB
62Time limit exceeded1.087s63312 KiB
63Accepted814ms10008 KiB
64Time limit exceeded1.083s53344 KiB
65Accepted720ms10292 KiB
66Time limit exceeded1.093s65728 KiB
67Accepted730ms8036 KiB
68Time limit exceeded1.085s63580 KiB
69Accepted740ms8804 KiB
70Time limit exceeded1.092s58732 KiB
71Accepted196ms10036 KiB