zoukankan      html  css  js  c++  java
  • 【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 }

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

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

  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/MisakaAzusa/p/8653422.html
Copyright © 2011-2022 走看看