1 条题解

  • 0
    @ 2025-10-1 0:47:17

    暴力枚举

    #include <bits/stdc++.h>
    using namespace std;
    int n, m, q;
    pair<int, int> e[100000 + 5];
    int t, a[100000 + 5];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m;
        for (int i = 1; i <= m; i++)
            cin >> e[i].first >> e[i].second;
        cin >> t;
        for (int i = 1; i <= t; i++)
            cin >> a[i];
        cin >> q;
        while (q--)
        {
            int op;
            cin >> op;
            if (op == 1)
            {
                int l, r, s;
                cin >> l >> r >> s;
                for (int i = l; i <= r; i++)
                {
                    int id = a[i];
                    if (s == e[id].first)
                        s = e[id].second;
                }
                cout << s << "\n";
            }
            else
            {
                int i, k;
                cin >> i >> k;
                a[i] = k;
            }
        }
    
        return 0;
    }
    

    满分的分块

    #include <bits/stdc++.h>
    using namespace std;
    int n, m, q;
    int siz;
    string temp;
    string e[100000 + 5];
    int t, a[100000 + 5];
    // ee[i]: [(i-1)*siz,i*siz) 的合成
    string ee[1000 + 5];
    void con(string &a, string &b)
    {
        for (int i = 0; i <= n - 1; i++)
            a[i] = b[a[i]];
    }
    void cal(int id)
    {
        int l = id * siz;
        int r = min(l + siz - 1, t - 1);
        ee[id] = e[a[l]];
        for (int i = l + 1; i <= r; i++)
            con(ee[id], e[a[i]]);
    }
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        cin >> n >> m;
        temp = "";
        for (int i = 0; i <= n - 1; i++)
            temp = temp + (char)i;
        for (int i = 0; i <= m - 1; i++)
        {
            int u, v;
            cin >> u >> v;
            u--, v--;
            e[i] = temp;
            e[i][u] = v;
        }
        cin >> t;
        siz = sqrt(t);
        for (int i = 0; i <= t - 1; i++)
        {
            cin >> a[i];
            a[i]--;
        }
        // 每 siz 个一合成
        for (int l = 0; l <= t - 1; l += siz)
            cal(l / siz);
        cin >> q;
        while (q--)
        {
            int op;
            cin >> op;
            if (op == 1)
            {
                int l, r, s;
                cin >> l >> r >> s;
                l--, r--, s--;
                int i;
                for (i = l; i <= r && i % siz != 0; i++)
                    s = e[a[i]][s];
                for (; i + siz <= r; i += siz)
                    s = ee[i / siz][s];
                for (; i <= r; i++)
                    s = e[a[i]][s];
                cout << s + 1 << "\n";
            }
            else
            {
                int i, k;
                cin >> i >> k;
                i--, k--;
                a[i] = k;
                cal(i / siz);
            }
        }
    
        return 0;
    }
    
    • 1

    信息

    ID
    101
    时间
    3000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    46
    已通过
    2
    上传者