zoukankan      html  css  js  c++  java
  • 洛谷 P2024 [NOI2001]食物链

    题意简述

    有人用两种说法对这 N 个动物所构成的食物链关系进行描述:
    1.“1 X Y”,表示 X 和 Y 是同类。
    2.“2 X Y”,表示 X 吃 Y 。
    有出 K 句话,这 K 句话有的是真的,有的是假的。
    当前的话与前面的某些真的话冲突,就是假话
    当前的话中 X 或 Y 比 N 大,就是假话
    当前的话表示 X 吃 X,就是假话
    输出假话的总数。

    题解思路

    开三个并查集,
    “x吃y”的关系

    merge(x, y+n);merge(x+n,y+2n);merge(x+2n,y);
    

    “x和y是同类”的关系

    merge(x,y);merge(x+n,y+n);merge(x+2n,y+2n);
    

    代码

    #include <cstdio>
    int n, k, opt, x, y, N, ans, x1, x2, x3, y1, y2, y3;
    int f[200000];
    int find(const int &x) {return f[x] == x ? x : f[x] = find(f[x]); }
    int main()
    {
    	scanf("%d%d", &n, &k);
    	N = n * 3;
    	for (register int i = 1; i <= N; ++i) f[i] = i;
    	for (register int i = 1; i <= k; ++i)
    	{
    		scanf("%d%d%d", &opt, &x, &y);
    		if (x > n || y > n) ++ans;
    		else
    		{
    			x1 = find(x); x2 = find(x + n); x3 = find(x + n * 2);
    			y1 = find(y); y2 = find(y + n); y3 = find(y + n * 2);
    			if (opt == 1)
    				if (x1 == y2 || x2 == y1) ++ans;
    				else {f[x1] = y1; f[x2] = y2; f[x3] = y3; }
    			else
    				if (x1 == y1 || x2 == y1) ++ans;
    				else {f[x1] = y2; f[x2] = y3; f[x3] = y1; }
    		}
    	}
    	printf("%d
    ", ans);
    }
    
  • 相关阅读:
    使用Stream流递归 组合树形结构
    MySQL 8 通用表表达式
    sa-token 权限认证
    先更新缓存还是先更新数据库?
    钉钉 回调事件 消息加解密
    commons-io
    stream和parallelstream的区别
    消除if...else
    springboot 扩展xml请求和响应
    springboot admin 邮箱
  • 原文地址:https://www.cnblogs.com/xuyixuan/p/9627883.html
Copyright © 2011-2022 走看看