首页 > 其他分享 >AcWing 240. 食物链

AcWing 240. 食物链

时间:2022-11-21 22:15:58浏览次数:70  
标签:食物链 ++ 假话 fa continue 240 ans find AcWing

我们定义:对于任意一个 \(i\):

  • \(i\) 表示其本身。
  • \(n + i\) 表示 \(i\) 的天敌。
  • \(2n + i\) 表示 \(i\) 的猎物。

(您可能不知道定义是最难想的)

题目中对于假话的定义是:

  1. 当前的话与前面的某些真的话冲突,就是假话;
  2. 当前的话中 X 或 Y 比 N 大,就是假话;
  3. 当前的话表示 X 吃 X,就是假话。

其中,第 \(2\)、\(3\) 条容易判断(直接特判),那第 \(1\) 条呢?

首先声明一下,只有真话才会被录入信息。

  • 如果 \(x\) 和 \(y\) 是同类,若 \(x\) 是 \(y\) 的天敌或猎物,那么是假话。
  • 如果 \(x\) 吃 \(y\),若 \(x\) 和 \(y\) 是同类,那么是假话。
  • 如果 \(x\) 吃 \(y\),若 \(x\) 是 \(y\) 的猎物,那么是假话。
  • 如果 \(x\) 吃 \(y\),若 \(y\) 是 \(x\) 的天敌,那么是假话。

关于 \(i\) 的天敌和猎物,我们已经有所定义。

所以,到这里,应该很容易看出来是并查集。

看出来是并查集,就很容易做了。

若您不会并查集,请移步至 AcWing 836. 合并集合

最后注意:合并时也有些讲究。(自己想想啊呀,待会看代码)

Code:

#include <iostream>
#include <cstdio>
using namespace std;
int n, k, ans = 0;
int fa[150010]; //注意数组开 3 倍。
int find (int x) {
    if(fa[x] != x) return fa[x] = find(fa[x]);
    return fa[x];
}
int main() {
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= 3 * n; i ++ )
        fa[i] = i; //基本初始化。
    while (k -- ) {
        int op, x, y;
        scanf("%d%d%d", &op, &x, &y);
        if(x > n || y > n) { ans ++; continue; }
        if(op == 1) {
            if(find(x) == find(y + n)) {
                ans ++;
                continue;
            }
            if(find(x) == find(y + 2 * n)) {
                ans ++;
                continue;
            }
            fa[find(y)] = find(x);
            fa[find(y + n)] = find(x + n);
            fa[find(y + 2 * n)] = find(x + 2 * n);
        }
        if(op == 2) {
            if(x == y) { ans ++; continue; }
            if(find(x) == find(y)) { ans ++; continue; }
            if(find(x) == find(y + 2 * n)) {
                ans ++;
                continue;
            }
            fa[find(x)] = find(y + n);
            fa[find(y)] = find(x + 2 * n);
            fa[find(x + n)] = find(y + 2 * n);
        }
        
    }
    printf("%d", ans);
    return 0;
}

若您觉得有帮助,就点个赞吧。

更多精彩请关注我的博客号~

祝各位 rp++ !

标签:食物链,++,假话,fa,continue,240,ans,find,AcWing
From: https://www.cnblogs.com/3042651coding/p/16913523.html

相关文章

  • 2022-11-21 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • AcWing 831.KMP字符串
    AcWing831.KMP字符串题目描述给定一个字符串S,以及一个模式串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模式串P在字符串S中多次作为子串出现。求出......
  • 2022-11-20 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • 2022-11-19 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • AcWing 66. 两个链表的第一个公共结点 (2012算法题)
    题目:输入两个链表,找出它们的第一个公共结点。当不存在公共节点时,返回空节点。数据范围链表长度[1,2000]。保证两个链表不完全相同,即两链表的头结点不相同。样例 ......
  • 2022-11-18 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • [AcWing 792]高精度减法
    点击查看代码#include<iostream>#include<vector>usingnamespacestd;//判断A>=B返回trueA<B返回falseboolcmp(vector<int>A,vector<int>B){//当A的......
  • 2022-11-18 Acwing每日一题
    本系列所有题目均为Acwing课的内容,发表博客既是为了学习总结,加深自己的印象,同时也是为了以后回过头来看时,不会感叹虚度光阴罢了,因此如果出现错误,欢迎大家能够指出错误,我......
  • DFS最大食物链计数
    洛谷4017最大食物链计数代码//https://www.luogu.com.cn/problem/P4017#include<iostream>#include<vector>usingnamespacestd;vector<int>map[5001];intdp[50......
  • AcWing 205. 斐波那契
    \(AcWing\)\(205\).斐波那契​​题目传送门​​一、题目描述在斐波那契数列中,\(F_ib_0=0,F_ib_1=1,F_ib_n=F_ib_{n−1}+F_ib_{n−2}(n>1)\)。给定整数\(n\),求\(F_ib_n~......