166532025-05-07 18:22:58algoproMaximum felosztáscpp17Időlimit túllépés 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2612 KiB
2Elfogadva6ms3128 KiB
subtask210/10
3Elfogadva3ms2612 KiB
4Elfogadva3ms2612 KiB
5Elfogadva3ms2612 KiB
6Elfogadva3ms2612 KiB
7Elfogadva3ms2612 KiB
8Elfogadva3ms2612 KiB
subtask315/15
9Elfogadva3ms2868 KiB
10Elfogadva3ms2612 KiB
11Elfogadva3ms2868 KiB
12Elfogadva4ms2868 KiB
13Elfogadva3ms2612 KiB
14Elfogadva3ms2612 KiB
15Elfogadva4ms2612 KiB
16Elfogadva18ms4660 KiB
17Elfogadva3ms2804 KiB
18Elfogadva8ms3608 KiB
subtask415/15
19Elfogadva6ms3176 KiB
20Elfogadva6ms3124 KiB
21Elfogadva4ms2872 KiB
22Elfogadva4ms2868 KiB
23Elfogadva4ms2832 KiB
24Elfogadva4ms2784 KiB
25Elfogadva6ms2900 KiB
26Elfogadva4ms2868 KiB
27Elfogadva421ms32092 KiB
28Elfogadva6ms2900 KiB
29Elfogadva6ms3020 KiB
30Elfogadva4ms2612 KiB
31Elfogadva43ms6628 KiB
32Elfogadva4ms2868 KiB
33Elfogadva182ms17104 KiB
34Elfogadva4ms2744 KiB
35Elfogadva149ms12340 KiB
36Elfogadva4ms2868 KiB
37Elfogadva19ms5100 KiB
38Elfogadva4ms2868 KiB
subtask50/60
39Időlimit túllépés1.085s22760 KiB
40Elfogadva488ms34964 KiB
41Elfogadva560ms40588 KiB
42Elfogadva402ms43372 KiB
43Elfogadva395ms42128 KiB
44Elfogadva287ms19104 KiB
45Elfogadva173ms29712 KiB
46Elfogadva987ms33260 KiB
47Elfogadva949ms30044 KiB
48Időlimit túllépés1.021s38428 KiB
49Időlimit túllépés1.085s33516 KiB
50Elfogadva995ms40152 KiB
51Elfogadva119ms21912 KiB
52Elfogadva74ms12492 KiB
53Elfogadva70ms11028 KiB
54Elfogadva59ms12136 KiB
55Elfogadva54ms8772 KiB
56Elfogadva838ms19208 KiB
57Elfogadva903ms22116 KiB
58Időlimit túllépés1.093s48988 KiB
59Elfogadva685ms7784 KiB
60Időlimit túllépés1.085s75424 KiB
61Elfogadva32ms5172 KiB
62Időlimit túllépés1.087s63312 KiB
63Elfogadva814ms10008 KiB
64Időlimit túllépés1.083s53344 KiB
65Elfogadva720ms10292 KiB
66Időlimit túllépés1.093s65728 KiB
67Elfogadva730ms8036 KiB
68Időlimit túllépés1.085s63580 KiB
69Elfogadva740ms8804 KiB
70Időlimit túllépés1.092s58732 KiB
71Elfogadva196ms10036 KiB