食物链
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 46039   Accepted: 13400

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句话有的是真的,有的是假的。当一句话满足下列三条之中的一个时,这句话就是假话,否则就是真话。 

1) 当前的话与前面的某些真的话冲突,就是假话; 

2) 当前的话中X或Y比N大,就是假话; 

3) 当前的话表示X吃X,就是假话。 

你的任务是依据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。 

Input

第一行是两个整数N和K,以一个空格分隔。 

下面K行每行是三个正整数 D,X,Y,两数之间用一个空格隔开,当中D表示说法的种类。 

若D=1,则表示X和Y是同类。 

若D=2,则表示X吃Y。

Output

仅仅有一个整数,表示假话的数目。

Sample Input

100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5

Sample Output

3

Source

i-A,i-B,I-C :表示i在第(A,B,C)类。

同一组:表示若1个组员成立,组员全成立

则可分别维护i在A,B,C组的情况。

i,j 同类:i-A=j-A,i-B=j-B,I-C=j-C

i吃j      :i-A=j-B,i-B=j-C,I-C=j-A

推断   :若i-A和j-B同类,则必有i吃j,否则无法确定(或因为其他连线不可能实现)。以此类推。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<iostream>
#include<cmath>
#include<cctype>
#include<ctime>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define RepD(i,n) for(int i=n;i>=0;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define Lson (x<<1)
#define Rson ((x<<1)+1)
#define MEM(a) memset(a,0,sizeof(a));
#define MEMI(a) memset(a,127,sizeof(a));
#define MEMi(a) memset(a,128,sizeof(a));
#define INF (2139062143)
#define F (100000007)
#define MAXN (3*50000+10)
#define MAXM (100000+10) long long mul(long long a,long long b){return (a*b)%F;}
long long add(long long a,long long b){return (a+b)%F;}
long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
typedef long long ll;
class bingchaji
{
public:
int father[MAXN],n;
void mem(int _n)
{
n=_n;
For(i,n) father[i]=i;
}
int getfather(int x)
{
if (father[x]==x) return x; return father[x]=getfather(father[x]);
}
void unite(int x,int y)
{
father[x]=getfather(father[x]);
father[y]=getfather(father[y]);
father[father[x]]=father[father[y]];
}
bool same(int x,int y)
{
return getfather(x)==getfather(y);
}
}S; int main()
{
// freopen("poj1182_template.in","r",stdin);
// freopen(".out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
S.mem(n*3);
int ans=0;
For(i,m)
{
int d,x,y;
scanf("%d%d%d",&d,&x,&y);
if (x>n||y>n||x<1||y<1) {ans++;continue;}
if (d==1)
{
if (S.same(x,y+n)||S.same(x,y+2*n)) ans++;
else
{
S.unite(x,y);S.unite(x+n,y+n);S.unite(x+2*n,y+2*n);
}
}
else
{
if (S.same(x,y)||S.same(x,y+2*n)) ans++;
else
{
S.unite(x,y+n);S.unite(x+n,y+2*n);S.unite(x+2*n,y);
} }
}
cout<<ans<<endl; return 0;
}

最新文章

  1. Gym - 100917H
  2. Mysql Innodb 间隙锁浅析
  3. iOS/Android网络消息推送的实现两种方法
  4. JavaScript是如何实现继承的(六种方式)
  5. 解决redmine写操作很慢的问题
  6. 整理PHP_YII环境安装遇到的一些问题
  7. AD组策略添加本地账号、设置允许ping回显
  8. 【英语】Bingo口语笔记(71) - shit系列
  9. BootStrap2学习日记21---消息提示
  10. Android基础_1 四大基本组件介绍与生命周期
  11. Java中迭代列表中数据时几种循环写法的效率比较
  12. idea下使用autowire注解注入对象,结果初始化不到类
  13. Content Provider Test过程中遇到的坑
  14. 一文带你了解 Spring 5.0 WebFlux 应用场景
  15. jmeter中的参数化
  16. CF444E. DZY Loves Planting
  17. iOS深浅拷贝
  18. 在做MVC和WebApi写返回数据时,可以这样定义
  19. 轻松读懂IL
  20. opencv源码学习: getGaussianKernel( 高斯核);

热门文章

  1. Snail—ORACLE基础之事务学习(五)
  2. S性能 Sigmoid Function or Logistic Function
  3. 概率统计(DP)
  4. 定制Attribute
  5. css3 3d旋转动画
  6. 使用javascript实现html文字不可选
  7. HDU 4081-Parsing URL(水)
  8. Device &amp;quot;/dev/sdg&amp;quot; is not a partition【再续】
  9. Android项目外接高德地图代码混淆注意事项
  10. 公交部署wifi热点,是否有必要?