Description:
编号为1~N的N位小朋友玩石头剪刀布游戏。亮出手势后在讨论游戏的结果时,他们以如下的形式表述:D X Y
如果D为1,表示编号为X的小朋友和编号为Y的小朋友手势相同。
如果D为2,表示编号为X的小朋友赢了编号为Y的小朋友。
由于他们是小朋友,可能会有人说假话。当满足以下三个条件之一时,判定这句话是假话:
1.当前的话与已经说出的真话矛盾;
2.X或Y比N大;
3.X赢了自己。
请你编程根据N和K句话,输出假话的数量。
Input:
第一行两个数N和K(1<=N<=50000,0<=k<=10000)。以下K行分别是D 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
Reference Code (Python):
n,k=list(map(int,input().split()))
fake=0
win=[[] for i in range(n)]
same=[[] for i in range(n)]
while k:
k-=1
d,x,y=list(map(int,input().split()))
if x>n or y>n or (d==2 and x==y):
fake+=1
continue
if d==1 and (x in win[y-1] or y in win[x-1]):
# 如果y赢了x,或者x赢了y,就矛盾,否则不矛盾。
fake+=1
continue
if d==2 and (x in same[y-1] or x in win[y-1]):
# 如果x和y一样,或者y赢了x,就矛盾,否则不矛盾。
fake+=1
continue
if d==1 and x not in same[y-1] and x!=y:
# x not in same[y-1]是为了防止读入相同数据,下同。
same[x-1].append(y)
same[y-1].append(x)
for i in range(n):
if i==x-1 or i==y-1:
continue
if x in same[i]:
# i和x一样,x赢了y,则i赢了y。
win[i].append(y)
if y in same[i]:
# i和y一样,x赢了y,则x赢了i。
win[x-1].append(i+1)
if d==2 and y not in win[x-1]:
win[x-1].append(y)
for i in range(n):
if i==x-1 or i==y-1:
continue
if x in win[i]:
# i赢了x,x赢了y,则y赢了i。
win[y-1].append(i+1)
if y in win[i]:
# i赢了y,x也赢了y,则i和x一样。
same[x-1].append(i+1)
same[i].append(x)
print(fake)