• E


    题目告诉有  3  种动物,互相吃与被吃,现在告诉你  m  句话,其中有真有假,叫你判断假的个数  (  如果前面没有与当前话冲突的,即认为其为真话  )。每句话开始都有三个数 D A B,当D = 1时,表示A B是同类,当D = 2时表示A  B

    分析:既然要求假话,肯定是说的话跟以前说的存在矛盾,比如A->B,B->A,这样很明显第二句话是假话了,跟第一句话冲突,那么我们应该怎么去查询这种冲突呢,我们知道查询两个节点之间关系最快的方法就是并查集,只要把一些节点归为一个集合,查询起来是非常方便的,那么这道题是不是也可以这么做呢?答案是肯定的,不过我们除了要记录每个节点的根节点以外,还要记录与根节点的关系,

    首先规定,生物之间的关系,0代表二者是同类,1代表A吃B,2代表A被B吃

    说假话的条件:
    1-   直接说假话,A或者B 的值大于动物的总数,(很明显是存在这种可能的,AB的取值范围大于动物总数),或者当D = 2, 时候 A == B,这也是一个睁眼说的假话,(这是同类相食,我们不允许这样的事情发生,所以这也是假话)。
    2- 间接说假话,间接说假话就是跟以前说的话有冲突,我们先查找A和B的根节点为 ra 和 rb 如果ra == rb(根节点相同,说明二者属于同一个集合),如果 D = 1(同类),但是他们与根节点的关系不相同,或者D = 2,AB也会产生矛盾(看后面图)。不过问题来了,我们只知道他们俩关系,我们应该怎么判断他们俩之间的是否有矛盾?

    大家看看这个是不是特别像什么东西??对了,就是向量,如果我们把这个转换成向量求是不是也可以呢???这是一个美好的想法,我们可以验证一下。
    很明显A->C = (A->B+B->C) % 3
    这也恰好是符合向量的运算,那么相同一棵树的节点间的关系就解决了。

    当然我们最重要的问题还没有解决,就是合并和路径压缩,怎么把两个不同的集合合并成一个呢?我们前面讲过,合并两个集合只需要把他们的boss合并就可以了,所以我们可以先找出来他们的根节点ra 和 rb
    我们想求出来 ra->rb ??
    根据向量加法我们得出来
    ra->rb = (ra->b+b->rb) % 3
    rb->b = (a->b – a->ra + 3) % 3

    合并一下两个公式得出来
    ra->rb = (a->b - a->ra + 3 + b->rb) %3

    有了这个关系我们就可以合并两个集合了,当然在做路径压缩的时候也不能忘了关系压缩。

     

    #include<stdio.h>

    const int maxn = 100005;

    int f[maxn], r[maxn];

    int Find(int x)
    {
        int k = f[x];
        if(f[x] != x)
        {
            f[x] = Find(f[x]);
            r[x] = (r[k]+r[x])%3;
        }

        return f[x];
    }

    int main()
    {
        int i, N, T, ans=0;

        scanf("%d%d", &N, &T);

        for(i=0; i<=N; i++)
        {
            f[i] = i;
            r[i] = 0;
        }

        while(T--)
        {
            int x, y, d;

            scanf("%d%d%d", &d, &x, &y);

            int rx = Find(x), ry = Find(y);

            if(x>N || y>N || (d==2&&x==y) )
                ans++;
            else if(rx == ry && (r[y]+d-1)%3 != r[x])
                ans++;
            else if(rx != ry)
            {
                f[rx] = ry;
                r[rx] = ((d-1)-r[x]+r[y]+3)%3;
            }
        }

        printf("%d ", ans);

        return 0;
    }

     


     

  • 相关阅读:
    Ionic在Generating ES5 bundles for differential loadind的时候报错
    将整个网站变为黑白 CSS3 filter grayscale
    ionic4 sqlite 的 executeSql 方法第二个参数不传会报错
    ionic4 执行ionic cordova run android 时报错Could not find plugin "proposal-numeric-separator". Ensure there is an entry in ./available-plugins.js for it.
    ion-picker组件示例(ionic4),这个组件有样式错乱的问题
    Linux下常用命令
    搜索引擎使用技巧
    Flex布局介绍
    0浏览器内幕探寻--源头
    Geolocation API
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4668205.html
Copyright © 2020-2023  润新知