• 【luogu P2024 食物链】 题解


    题目链接:https://www.luogu.org/problemnew/show/P2024

    摘吊打集训队的九日dalao一句话

    关于带有多个相对集合的全集,我们可以多开几倍的空间。每一倍的元素表示这个当前里的相对元素

    那么这道题,既然只有三种关系,我们就可以搞三个并查集来记录不同的关系。

    我们令fa[i]表示自己本身,fa[i+n]表示猎物,fa[i+n+n]表示天敌。

    接着就是对这道题的处理:

    首先,吐槽一句,这nm什么xjb食物链。。明明是个环。。

    其次,吐槽两句,这nm为什么无脑相信前面的话。。总觉得很没有理性思维啊。。

    百度百科对食物链的解释:
    生态系统中的生物种类繁多,并且在生态系统分别扮演着不同的角色,根据它们在能量和物质运动中所起的作用,可以归纳为生产者、消费者和分解者三类。
    生产者主要是绿色植物,能用无机物制造营养物质的自养生物,这种功能就是光合作用,也包括一些化能细菌(如硝化细菌),它们同样也能够以无机物合成有机物,生产者在生态系统中的作用是进行初级生产或称为第一性生产,因此它们就是初级生产者或第一性生产者,其产生的生物量称为初级生产量或第一性生产量。生产者的活动是从环境中得到二氧化碳和水,在太阳光能或化学能的作用下合成碳水化合物(以葡萄糖为主)。因此太阳辐射能只有通过生产者,才能不断的输入到生态系统中转化为化学能力即生物能,成为消费者和分解者生命活动中唯一的能源。
    消费者属于异养生物,指那些以其他生物或有机物为食的动物。根据食性不同,可以区分为食草动物和食肉动物两大类。食草动物称为第一级消费者,它们吞食植物而得到自己需要的食物和能量,这一类动物如一些昆虫、鼠类、野猪一直到象。食草动物又可被食肉动物所捕食,这些食肉动物称为第二级消费者,如瓢虫以蚜虫为食,黄鼠狼吃鼠类等,这样,瓢虫和黄鼠狼等又可称为第一级食肉者。又有一些捕食小型食肉动物的大型食肉动物如狐狸、狼、蛇等,称为第三级消费者或第二级食肉者。又有以第二级食肉动物为食物的如狮、虎、豹、鹰、鹫等猛兽猛禽,就是第四级消费者或第三级食肉者。此外,寄生物是特殊的消费者,根据食性可看作是草食动物或食肉动物。但某些寄
    营养级结构营养级结构
    生植物如桑寄生、槲寄生等,由于能自己制造食物,所以属于生产者。而杂食类消费者是介于食草性动物和食肉性动物之间的类型,既吃植物,又吃动物,如鲤鱼、熊等。人的食物也属于杂食性。这些不同等级的消费者从不同的生物中得到食物,就形成〝营养级〞。
    由于动物不只是从一个营养级的生物中得到食物,如第三级食肉者不仅捕食第二级食肉者,同样也捕食第一级食肉者和食草者,所以它属于几个营养级。而最后达到人类是最高级的消费者,他不仅是各级的食肉者,而且又以植物作为食物。所以,各个营养级之间的界限是不明显的。
    实际在自然界中,每种动物并不是只吃一种食物。因此形成一个复杂的食物链网。
    分解者也是异养生物,主要是各种细菌和真菌,也包括某些原生动物及腐食性动物如食枯木的甲虫、白蚁,以及蚯蚓和一些软体动物等。它们把复杂的动植物残体分解为简单的化合物,最后分解成无机物归还到环境中去,被生产者再利用。分解者在物质循环和能量流动中具有重要的意义,因为大约有90% 的陆地初级生产量都必须经过分解者的作用而归还给大地,再经过传递作用输送给绿色植物进行光合作用。所以分解者又可称为还原者。
     
    那么我们看,假话就那么几种情况:
    如果1和2是同类,那么要是在之前1和2有过猎物或者天敌关系,则为假。
    如果1吃2,那么要是在之前1被2吃掉或者1和2是同类,则为假。
    还有就是题目里裸裸的假话情况。
    那么,我们还需要维护几种关系:
    如果是同类,那么他们的天敌和猎物都是一样的。
    如果是猎物,那么猎物的猎物就是天敌。
    如果是天敌,那么天敌的天敌就是猎物。
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 using namespace std;
     5 const int maxn = 300010;
     6 int fa[maxn], n, k, ans;
     7 int find(int x)
     8 {
     9     return fa[x] == x?fa[x]:fa[x] = find(fa[x]);
    10 }
    11 void unionn(int x, int y)
    12 {
    13     int r1 = find(x);
    14     int r2 = find(y);
    15     if(r1 != r2)
    16     fa[r2] = r1; 
    17 }
    18 int main()
    19 {
    20     scanf("%d%d",&n,&k);
    21     int a,b,c;
    22     int nn = n*2;    
    23     for(int i = 1; i <= n*3; i++)
    24     {
    25         fa[i] = i;
    26     }
    27     while(k--)
    28     {
    29         scanf("%d%d%d",&a,&b,&c);
    30         
    31         if(b>n||c>n)
    32         {
    33             ans++;
    34             continue;    
    35         }    
    36             
    37         if(a == 1)
    38         {
    39             if(find(b+n) == find(c) || find(b+nn) == find(c))    
    40             {
    41                 ans++;
    42                 continue;
    43             }
    44             unionn(b,c);unionn(b+n,c+n);unionn(b+nn,c+nn);//b,c是同类,那么就什么都是一样的。 
    45         }
    46         if(a == 2)
    47         {
    48             if(b==c)
    49             {
    50                 ans++;
    51                 continue;
    52             }
    53             if(find(b) == find(c)||find(b+nn) == find(c))
    54             {
    55                 ans++;
    56                 continue;
    57             }
    58             unionn(b,c+nn);unionn(b+n,c);unionn(b+nn,c+n);//b吃c,c的天敌是b,b的猎物是c,b的天敌就是c的猎物。 
    59         }
    60     }
    61     printf("%d",ans);
    62     return 0;
    63 }

    隐约雷鸣,阴霾天空,但盼风雨来,能留你在此。

    隐约雷鸣,阴霾天空,即使天无雨,我亦留此地。

  • 相关阅读:
    3: Flink 运行命令 设置port
    4: docker 安装flink 1.14
    6: Docker Compose简单知识
    十二 docker 安装kafka
    十三 查看kafka版本
    2: Windows安装1.9.3 flink && first demo project
    5: win10 使用IDEA调试编译flink 1.14
    1: Windows上安装Flink
    Chrome 96 新功能
    js map遍历与promise一起使用会出现的问题,以及解决方案
  • 原文地址:https://www.cnblogs.com/MisakaAzusa/p/8653422.html
Copyright © 2020-2023  润新知