\(\\\)

Description


有三类动物 \(A,B,C\),满足\(A\) 吃 \(B\),\(B\)吃 \(C\),\(C\) 吃 \(A\)。

现有 \(N\) 个动物,以 \(1 - N\) 编号。每个动物都是 \(A,B,C\) 中的一种。

有人用两种说法对这 \(N\) 个动物所构成的食物链关系进行描述:

第一种说法是“1 X Y”,表示 X 和 Y 是同类。

第二种说法是“2 X Y”,表示 X 吃 Y 。

此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真

的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。

  • 当前的话与前面的某些真的话冲突,就是假话

  • 当前的话中 X 或 Y 比 N 大,就是假话

  • 当前的话表示 X 吃 X,就是假话

你的任务是根据给定的 N 和 K 句话,输出假话的总数。

  • \(n\le 5\times 10^4,K\le 10^5\)

\(\\\)

Solution


扩展域的并查集。

建立三个域,分别为 \(x,x+n,x+2n\)。

如果 \(x,y\) 在一个集合里,代表 \(x,y\) 是同类。

如果 \(x+n,y\) 在一个集合里,代表 \(y\) 为 \(x\) 的捕食对象。

如果 \(x+2n,y\) 在一个集合里,代表 \(y\) 为 \(x\) 的天敌。

注意这里以 \(x\) 为中心构建的集合,具有代表意义。

即 \(x+n,x+2n\) 只作为中转点,所在的集合中所有 \(n\) 范围内的点含义相同。

\(\\\)

对于同类语句:

如果某一个是另一个的天敌或捕食对象 \(GG\) 。

否则合并两者的三个集合。

\(\\\)

对于捕食语句 \((x\) 捕食 \(y)\):

如果两者是同类 \(GG\) 。

如果 \(y\) 是 \(x\) 的天敌 \(GG\) 。

因为只有三个集合,所以合并:

  • \(x\) 和 \(y+2n\): \(x\) 是 \(y\) 的天敌。

  • \(x+n\) 和 \(y\) : \(y\) 是 \(x\) 的捕食对象。

  • \(x+2n\) 和 \(y+n\) :第三类关系,\(x\) 的天敌一定是 \(y\) 的捕食对象。

\(\\\)

在这个过程中应该有一些思考。

合并的有效对象其实一直是 \([1,n]\) 范围内的点,而我们只是通过等价关系借用了两个扩展域合并。

所有的查询也是借用定义,实则查的其实还是 \([1,n]\) 范围内的点。

\(\\\)

Code


#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 150010
#define R register
#define gc getchar
using namespace std; inline int rd(){
int x=0; bool f=0; char c=gc();
while(!isdigit(c)){if(c=='-')f=1;c=gc();}
while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=gc();}
return f?-x:x;
} int n,m,ans,f[N]; inline void reset(){for(R int i=1;i<N;++i) f[i]=i;} int find(int x){return x==f[x]?x:f[x]=find(f[x]);} inline void merge(int x,int y){f[find(x)]=find(y);} int main(){
n=rd(); m=rd(); reset();
for(R int i=1,op,x,y;i<=m;++i){
op=rd(); x=rd(); y=rd();
if(x>n||y>n){++ans;continue;}
if(op==1){
if(find(x)==find(y+n)||find(x)==find(y+2*n)){++ans;continue;}
merge(x,y); merge(x+n,y+n); merge(x+n*2,y+n*2);
}
else{
if(x==y){++ans;continue;}
if(find(x)==find(y)||find(x+2*n)==find(y)){++ans;continue;}
merge(x,y+n*2); merge(x+n,y); merge(x+n*2,y+n);
}
}
printf("%d\n",ans);
return 0;
}

[ NOI 2001 ] 食物链的更多相关文章

  1. NOI 2001 食物链(eat)

    1074 食物链 2001年NOI全国竞赛  时间限制: 3 s  空间限制: 64000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description ...

  2. NOI 2001 食物链 /// 并查集 oj22035

    Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1~N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到 ...

  3. NOI全国赛(2001)--食物链

    今天写了道并查集的题,看来并查集的题刷少了,,,,,用法好神奇啊!!!开三倍并查集 用i表示自己,i+n存天敌,i+2*n存可以克制de,再逻辑判断一下即可. 所以,要意识到并查集的分类处理可以开不同 ...

  4. [NOI 2001]炮兵阵地

    Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一 ...

  5. [ NOI 2001 ] 方程的解数

    \(\\\) \(Description\) 已知一个 \(N\) 元高次方程: \[ k_1x_1^{p_1}+k_2x_2^{p_2}+...+k_nx_n^{p_n}=0 \] 要求所有的 \( ...

  6. Codevs 1074 食物链 2001年NOI全国竞赛

    1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 动物王国中有三类动物 A,B ...

  7. CODEVS 1074 食物链 2001年NOI全国竞赛(洛谷 P2024)

    题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B,B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并 ...

  8. 1074 食物链 2001年NOI全国竞赛

    1074 食物链 2001年NOI全国竞赛 时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond         题目描述 Description 动物王国中有三类动物 ...

  9. 食物链 2001年NOI全国竞赛

    时间限制: 3 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond   题目描述 Description 动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形.A吃B ...

随机推荐

  1. MongoDB小结03 - insert、remove

    连接MongoDB(bin目录下) ./mongo 如果觉得shell里空空的可以输入help,在刷屏的同时大致了解下有哪些方法 help 现在咱们还没有数据库,咱们创建一个,任性起名:templat ...

  2. ViewFlipper实现ViewPager的页面切换效果

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...

  3. list.ensureCapacity竟然会变慢

    list.ensureCapacity竟然会变慢 jdk1.8 应该是做了优化了: public class Test10 { public static void main(String[] arg ...

  4. outlook pst 过大,要立刻处理

    用鼠標右鍵點擊Email Account,選擇“資料檔案屬性” 進入內容,再點擊“資料夾大小”, “全部大小”不要大於20,480,000KB(20GB), 如果超過請立即分拆此pst檔案, 或者點擊 ...

  5. UVA10081-Tight Words(递推)

    题目链接 题意:给出一个0到k的序列,要求出有每相邻的两个数之间的差不差过1的子序列的概率. 思路:递推.dp[i][j]表示长度为i而且j结尾的子序列的个数. 注意.假设用符合子序列个数除以从个数. ...

  6. powershell 的版本号所引起的载入 FSharp 编译器问题

    powershell 的版本号所引起的载入 FSharp 编译器问题 在 64 位的系统下,大部分系统文件都有 64 位和 32 位的版本号:通常在C:\WINDOWS\system32 下的是 64 ...

  7. PH_Pooled Featrues Classification MIREX 2011 Submission

    Abstract Principal Mel-Spectrum Components (Feature) Temporal Pooling Functions (Model) Single Hidde ...

  8. Netty In Action中文版 - 第四章:Transports(传输)

    本章内容 Transports(传输) NIO(non-blocking IO,New IO), OIO(Old IO,blocking IO), Local(本地), Embedded(嵌入式) U ...

  9. 协方差矩阵与主成分分析PCA

    今天看论文,作者是用主成分分析(PCA)的方法做的.仔细学习了一下,有一篇博客写的很好,介绍的深入浅出! 协方差:http://pinkyjie.com/2010/08/31/covariance/ ...

  10. eventkeyboardmouse

    http://www.javascriptkit.com/jsref/eventkeyboardmouse.shtml