1 해설

  • 1
    @ 2026-9-13 19:59:45

    首先,这题在洛谷已经降绿了。

    这题可以这么想:有一些状态,如果有操作就是查询或者将两个状态合并。

    具体见代码。

    #include<bits/stdc++.h>
    using namespace std;
    int fa[150005];
    int getfa(int x){
    	if(fa[x]==x) return x;
    	return fa[x]=getfa(fa[x]);
    }
    void merrrrrr(int x,int y){//merrrrrr!!!!!!
    	if(getfa(x)==getfa(y)) return ;
    	fa[getfa(x)]=getfa(y);
    	return ;
    }
    int main(){
    	int n,k,ans=0;
    	cin>>n>>k;
    	for(int i=1;i<=3*n;i++){
    		fa[i]=i;
    	}
    	while(k--){
    		int op;
    		cin>>op;
    		if(op==1){
    			int x,y;
    			cin>>x>>y;
    			if(x>n||y>n){
    				ans++;
    				continue;
    			}
    			if(getfa(x+n)==getfa(y)||getfa(y+n)==getfa(x)){
    				ans++;
    			}
    			else{
    				merrrrrr(x,y);
    				merrrrrr(x+n,y+n);
    				merrrrrr(x+2*n,y+2*n);
    			}
    		} else{
    			int x,y;
    			cin>>x>>y;
    			if(x>n||y>n){
    				ans++;
    				continue;
    			}
    			if(getfa(x)==getfa(y)||getfa(x)==getfa(y+n)){
    				ans++;
    			}
    			else{
    				merrrrrr(x+n,y);
    				merrrrrr(x+2*n,y+n);
    				merrrrrr(x,y+2*n);
    			}
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    

    还有,注意合并时候的细节问题以及能否合并。

    这题难度不高,但是如果是初学并查集的,建议先做这几题。

    请做这些。

    • 1

    정보

    ID
    456
    시간
    1000ms
    메모리
    256MiB
    난이도
    5
    태그
    제출 기록
    58
    맞았습니다.
    22
    아이디