首页 > 其他分享 >题解:SP1442 CHAIN - Strange Food Chain

题解:SP1442 CHAIN - Strange Food Chain

时间:2024-06-05 20:34:58浏览次数:29  
标签:CHAIN Chain Get int 题解 查集 Merge fa Find

双倍经验:P2024 [NOI2001] 食物链

思路:

一眼鉴定为并查集。

观察题目发现有三种状态,考虑使用种类并查集(又称扩展域并查集)。

既然有三种状态那么种类并查集自然也要开三倍。

CODE:

#include<bits/stdc++.h>
using namespace std;
int fa[150010];
int Get_Find(int x){//寻找父节点
    if(x==fa[x]) return x;
    return fa[x]=Get_Find(fa[x]);//路径压缩
}
void Merge(int x,int y){//合并(乱认祖先)
    x=Get_Find(x),y=Get_Find(y);
    if(x==y) return;
    fa[x]=y;
}
main(){
    int t;
    cin>>t;
    while(t--){
        int x,y,z;
        int n,m;
        cin>>n>>m;
        for(int i=1;i<=150001;i++) fa[i]=i;//初始化
        int cnt=0;
        for(int i=1;i<=m;i++){
        	int x,y,op;
        	cin>>op>>x>>y;
        	if(x>n||y>n){
        	    cnt++;
        	    continue;
        	}
        	if(op==1){
        		if(Get_Find(x+n)==Get_Find(y)||Get_Find(x+2*n)==Get_Find(y)){//判断是否不合法
        			cnt++;
        			continue;
    			}
    			Merge(x,y);//合并
    			Merge(x+n,y+n);
    			Merge(x+2*n,y+2*n);
    		}else{
    			if(Get_Find(x+2*n)==Get_Find(y)||Get_Find(x)==Get_Find(y)){
        			cnt++;
        			continue;
    			}
    			Merge(x,y+2*n);
    			Merge(x+n,y);
    			Merge(x+2*n,y+n);
    		}
    	}
    	cout<<cnt<<"\n";
    }
}

标签:CHAIN,Chain,Get,int,题解,查集,Merge,fa,Find
From: https://www.cnblogs.com/zhouyk0501/p/18233728

相关文章

  • P1654 OSU! 题解
    P1654OSU!题解题目链接好题!但不得不说早期洛谷的题解质量是真的差,感觉没有一篇题解是讲的特别清楚的,我看了好久才搞懂。下面是我认为的一种更规范的解题过程。首先,我们设随机变量\(X_i\)表示从\(i\)向左的极长1串的长度,并且对于任意的\(i\),我们要想办法求出\(E(X_i......
  • AI菜鸟向前飞 — LangChain系列之十六 - Agent系列:从现象看机制(下篇)一款“无需传递中
    前言    AI菜鸟向前飞—LangChain系列之十四-Agent系列:从现象看机制(上篇)    AI菜鸟向前飞—LangChain系列之十五-Agent系列:从现象看机制(中篇)一个Agent的“旅行”    回顾前两篇文章,大家会发现一个问题    为什么每次Agent在invoke的时候需要多加......
  • (第26天)【leetcode题解】226、翻转二叉树 589、N叉树的前序遍历 590、N叉树的后序遍
    目录226、翻转二叉树题目描述思路代码589、N叉树的前序遍历题目描述思路代码590、N叉树的后序遍历题目描述思路代码思考总结226、翻转二叉树题目描述给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,......
  • Codeforces Round 949题解(A、B、C)
    A.TurtleandPiggyArePlayingaGame首先\(p\)选\(2\)的话除得最慢,得的分多。考虑二进制表示,如果\(x=(1000000000)_{bin}\),则每次除以\(2\)都是相当于右移一位,除完之后仍然是\(2\)的倍数,变成\(1\)的步数就是把最高位的\(1\)移动到\(0\)位的步数。因为\(2l\ler\),所以\(l......
  • P8125 [BalticOI 2021 Day2] The short shank 题解
    首先会发现若\(t_i<=T\)的话那么他最终一定会造反。我们只考虑\(t_i>T\)的情况。设\(lst_i\)表示\(i\)左边第一个可以影响(使他造反)到\(i\)的位置,那么我们一定要在\([lst_i,i]\)这个区间中的某一个位置放上床垫才能使\(i\)不造反。这样有一个\(O(nd)\)的dp,但......
  • 2024年03月 GESP等级认证Python编程(一级)试题解析
    【单选题】(每题2分)1、小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是?()A、小程序   B、计时器   C、操作系统   D、神话人物   正确答案:C2、中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是?()A、制......
  • Codeforces Round 950 (Div. 3)个人题解(A~F1)
    CodeforcesRound950(Div.3)个人题解(A~F1)题解火车头#define_CRT_SECURE_NO_WARNINGS1#include<iostream>#include<vector>#include<algorithm>#include<set>#include<unordered_map>#include<cstring>#include<cstdio&......
  • 按按钮题解
    按按钮题解在量体温,打不了代码,来写题解。赞美lwq,三句话让我跟上了课堂节奏。题意数轴\(n\)个按钮,第\(i\)个按钮在坐标\(i\)。有\(m\)次询问,\(i\)询问为在时刻\(t_i\)按下\(b_i\)。可以在时刻\(0\)安排一些机器人,机器人可以花\(1\)单位时间向左或右移动\(1\)......
  • acwing329 围栏障碍训练场 题解
    考试压轴题,意识到这题是线段树优化\(dp\)时追悔莫及。为了简化题目,我将从起点到原点变成了从原点到起点(这样就可以省去两个数组的空间)。想到设\(dp_{i,j}\)表示在第\(i\)层,奶牛们在\(j\)列时的最小移动范围,则转移方程为(设输入为\(l,r\)):\[\begin{cases}dp_{i,j}=dp_{......
  • 供应链安全论文阅读(一)Backstabber's Knife Collection: A Review of Open Source Soft
    引言该论文Backstabber'sKnifeCollection:AReviewofOpenSourceSoftwareSupplyChainAttacks发表在2020年的DIMVA上,作者为波恩大学的MarcOhm。本文是开源软件供应链安全领域较早期的一篇论文,主要针对软件供应链中恶意软件包的威胁进行了详细介绍。首先简单介绍一下软......