并查集

忽略全局加,实际上只有一种操作:把所有指定价格的物品统一修改为另一种价格。

使用 unordered_map 记录每个值的出现次数,然后做完了,赫赫。

时间复杂度 $O(n+q)$。

#include<bits/stdc++.h>
using namespace std;
unordered_map<long long,int> m;
long long ans,add;
int n,q;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        static int x;
        cin>>x,++m[x],ans+=x;
    }
    cin>>q;
    for(int i=1;i<=q;i++){
        static string s;
        static int x,y;
        cin>>s;
        if(s[0]=='I') cin>>x,add+=x;
        else{
            cin>>x>>y;
            if(m.count(x-add)&&x!=y){
                ans+=1ll*m[x-add]*(y-x);
                m[y-add]+=m[x-add];
                m[x-add]=0;
            }
        }
        cout<<ans+add*n<<'\n';
    }
    return 0;
}
最后修改:2024 年 07 月 23 日
如果觉得我的文章对你有用,请随意赞赏