启发式合并50分,hackTLE求调!deepseek越改分数越少
查看原帖
启发式合并50分,hackTLE求调!deepseek越改分数越少
473401
zcxnb楼主2025/7/23 10:23
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=1e6+5;
int n,m,ans;
int en[M],len[M],b[M],a[N],p[N];
void merge(int x,int y){
    if(x==y||len[b[x]]==0||b[x]==b[y])  return;
    if(len[x]>len[y]){
        swap(b[x],b[y]);
    }
    int s1=b[x],s2=b[y];
    b[x]=y;
    for(int i=en[s1];i;i=p[i]){
        if(s2==a[i-1])  ans--;
        if(s2==a[i+1])  ans--;
    }
    int pri=0;
    for(int i=en[s1];i;i=p[i]){
        a[i]=s2;
        pri=i;
    }
    p[pri]=en[s2];en[s2]=en[s1];
    b[s1]=s2;
    len[s2]+=len[s1];
    en[s1]=len[s1]=0;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        if(a[i]!=a[i-1])  ans++;
        p[i]=en[a[i]];en[a[i]]=i;
        b[a[i]]=a[i];
        len[a[i]]++;
    }
    for(int i=1;i<=m;i++){
        int op,x,y;
        scanf("%d",&op);
        if(op==2)  printf("%d\n",ans);
        else{
            scanf("%d%d",&x,&y);
            merge(x,y);
        }
    }
}
2025/7/23 10:23
加载中...