3 条题解

  • 0
    @ 2026-7-6 11:10:08
    #include <bits/stdc++.h>
    using namespace std;
    
    
    map<int, set<int>>mp;
    int ans = 2147483647;
    void dis(int id, int x){  // 更新答案
        auto it = mp[id].lower_bound(x);
        if(it != mp[id].end()) ans = min(ans, *it - x);
        if(it != mp[id].begin()) --it, ans = min(ans, x - *it);
    }
    void solve() {
        int n, m;
        scanf("%d%d", &n, &m);
        for (int i = 1 ; i <= n ; i ++) {
            int x; scanf("%d", &x);
            dis(x, i);
            mp[x].insert(i);
        }
        while(m--) {
            int x, y;
            scanf("%d%d", &x, &y);
            if (x == y) printf("%d\n", ans);
            else {
                if (mp[x].size() > mp[y].size()) swap(mp[x], mp[y]);
                for (auto it : mp[x]) {  // 启发式合并, 小的往大的上面并
                    dis(y, it);
                    mp[y].insert(it);
                }
                mp[x].clear(); printf("%d\n", ans);
            }
        }
    }
    int main()
    {
        solve();
        return 0;
    }
    

    信息

    ID
    770
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    (无)
    递交数
    47
    已通过
    6
    上传者