166552025-05-07 18:28:38algoproMaximum felosztáscpp17Futási hiba 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;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva3ms2612 KiB
2Futási hiba3ms3052 KiB
subtask20/10
3Elfogadva3ms2612 KiB
4Futási hiba3ms2804 KiB
5Elfogadva4ms2612 KiB
6Elfogadva3ms2612 KiB
7Futási hiba3ms2668 KiB
8Elfogadva3ms2828 KiB
subtask30/15
9Futási hiba4ms2868 KiB
10Futási hiba4ms2720 KiB
11Elfogadva3ms2868 KiB
12Elfogadva3ms2624 KiB
13Futási hiba3ms2880 KiB
14Futási hiba3ms2800 KiB
15Elfogadva4ms2804 KiB
16Elfogadva13ms4660 KiB
17Futási hiba3ms2868 KiB
18Elfogadva7ms3424 KiB
subtask40/15
19Futási hiba4ms2880 KiB
20Futási hiba4ms2868 KiB
21Futási hiba3ms2868 KiB
22Elfogadva4ms2868 KiB
23Futási hiba3ms2612 KiB
24Elfogadva4ms2880 KiB
25Futási hiba3ms2868 KiB
26Futási hiba3ms2768 KiB
27Futási hiba3ms2972 KiB
28Futási hiba4ms2868 KiB
29Elfogadva6ms3124 KiB
30Elfogadva4ms2612 KiB
31Elfogadva28ms6604 KiB
32Elfogadva4ms2872 KiB
33Elfogadva128ms16984 KiB
34Elfogadva4ms2868 KiB
35Elfogadva72ms12312 KiB
36Futási hiba3ms2868 KiB
37Elfogadva17ms4744 KiB
38Futási hiba3ms2868 KiB
subtask50/60
39Időlimit túllépés1.09s21148 KiB
40Futási hiba23ms4660 KiB
41Elfogadva474ms39684 KiB
42Elfogadva368ms42476 KiB
43Elfogadva382ms41360 KiB
44Futási hiba19ms4148 KiB
45Futási hiba17ms3636 KiB
46Elfogadva902ms32080 KiB
47Futási hiba32ms6212 KiB
48Elfogadva967ms37104 KiB
49Futási hiba32ms6176 KiB
50Időlimit túllépés1.006s38968 KiB
51Elfogadva109ms21248 KiB
52Elfogadva67ms12560 KiB
53Futási hiba17ms3384 KiB
54Elfogadva56ms12088 KiB
55Elfogadva50ms8872 KiB
56Elfogadva837ms18016 KiB
57Elfogadva797ms21028 KiB
58Futási hiba29ms6244 KiB
59Futási hiba28ms6244 KiB
60Futási hiba17ms3480 KiB
61Futási hiba17ms3588 KiB
62Futási hiba28ms6252 KiB
63Elfogadva700ms9080 KiB
64Időlimit túllépés1.105s77676 KiB
65Elfogadva649ms9316 KiB
66Futási hiba29ms6244 KiB
67Futási hiba29ms6244 KiB
68Időlimit túllépés1.088s79204 KiB
69Elfogadva694ms7840 KiB
70Időlimit túllépés1.105s68392 KiB
71Elfogadva197ms9068 KiB