#3526. 学校社团的等级制度
学校社团的等级制度
题目背景
某学校有三个社团:围棋社(A)、象棋社(B) 和 书法社(C)。
这三个社团之间有固定的“鄙视链”:
- 围棋社的人 看不起 象棋社的人
- 象棋社的人 看不起 书法社的人
- 书法社的人 看不起 围棋社的人
(注意:鄙视关系不是相互的,比如围棋社看不起象棋社,但象棋社不一定看不起围棋社)
题目描述
学校里有 N 个学生,编号为 1 ~ N。
每个学生分别属于这三个社团中的一个,但你不知道具体谁属于哪个社团。
有人根据学生之间的日常对话,记录下了 K 条关于社团关系的信息,每条信息有两种类型:
- 类型 1:
X Y—— 表示学生 X 和学生 Y 属于同一个社团 - 类型 2:
X Y—— 表示学生 X 看不起 学生 Y(即 X 的社团看不起 Y 的社团)
但这个人记录的有些信息可能是假的。一条信息是假的,当且仅当它满足以下任意一条:
- 当前信息与前面所有真实信息冲突
- 信息中的学生编号 X 或 Y 超出了
1 ~ N的范围 - 类型 2 的信息中,X 和 Y 是同一个学生(一个人不能看不起自己)
请你统计出这些信息中,假话的总数。
输入格式
第一行两个整数 N 和 K。
接下来 K 行,每行三个整数 D, X, Y:
- 若
D = 1,表示“X 和 Y 属于同一个社团” - 若
D = 2,表示“X 看不起 Y”
输出格式
一个整数,表示假话的数量。
样例输入
100 7
1 101 1
2 1 2
2 2 3
2 3 3
1 1 3
2 3 1
1 5 5
样例输出
3
样例解释
| 序号 | 信息 | 真假 | 原因 |
|---|---|---|---|
| 1 | 1 101 1 |
假 | 学生101不存在(超过N=100) |
| 2 | 2 1 2 |
真 | 1看不起2,暂时成立 |
| 3 | 2 2 3 |
2看不起3,暂时成立 | |
| 4 | 2 3 3 |
假 | 自己看不起自己 |
| 5 | 1 1 3 |
与前面信息冲突(1看不起2,2看不起3,说明1和3不是同类) | |
| 6 | 2 3 1 |
真 | 3看不起1,形成循环鄙视链 |
| 7 | 1 5 5 |
同一个人肯定和自己同类 |
所以假话总数 = 3
数据范围
1 ≤ N ≤ 500000 ≤ K ≤ 1000001 ≤ D ≤ 21 ≤ X, Y ≤ N
原题对照(方便你理解转换)
| 原食物链题目 | 新社团题目 |
|---|---|
| A吃B,B吃C,C吃A | 围棋社看不起象棋社,象棋社看不起书法社,书法社看不起围棋社 |
| 1 X Y 表示同类 | 1 X Y 表示同一社团 |
| 2 X Y 表示X吃Y | 2 X Y 表示X看不起Y |
| X吃X是假话 | 自己看不起自己是假话 |
| 编号越界 | 学生编号越界 |
| 与前面冲突 | 与前面真实信息冲突 |