由于考场上只剩下半个小时了,看这题目也有点难,就放弃了,现在有时间了,复盘了下。发现如果不太了解区块链,一开始真的连题目都看不懂,看了半天才看懂这题目啥意思。
简单的说就是,有n个节点,每个节点都有一条主链,初始都是长度为1,只有一个创世块0。这n个节点通过m条边相连接。输入的命令有两种,一种是创建新块的命令,如a b c,表示节点a在时间b时在主链尾端加上新块c;另一种是查询命令,如a b,表示查询节点a在时间b时的主链。还有在节点更新了主链时要发送自己的主链给它的邻居。而节点更新有两种情况,一是创建新块,二是接受邻居的链。
题目大致就是如此了,详细的可以自己看看上面的原题。这题是一道典型的模拟题,看懂了题意代码就好写了。但自己python学的不太好,写的时候忘了python的列表和字典的直接赋值是浅拷贝,折腾了一个多小时。
from copy import deepcopy
n,m=map(int,input().split())
G={
}#邻接表
point={
}#节点状态
command=[]#存储消息传递命令
for i in range(n):#节点状态初始化
point[i+1]=[1,[0]]
for i in range(m):
G[input()]=1
t,k=map(int,input().split())
def addcom(sr):#添加更新命令
temp = []
for i in range(n):
if G.get(sr[0] + ' ' + str(i + 1), None) or G.get(str(i + 1) + ' ' + sr[0], None):
temp.append(i + 1)
if temp != []:
command.append([int(sr[1]) + t, temp, point[int(sr[0])][0], deepcopy(point[int(sr[0])][1])])
def update(time):#处理更新命令
while command!=[]:
if command[0][0]>time:
break
for dist in command[0][1]:
if command[0][2]>point[dist][0] or (command[0][2]==point[dist][0] and command[0][3][-1]<point[dist][1][-1]):
#收到的链更长,或收到的链长度和自身主链相同,但最后一块的编号更小
point[dist][0]=command[0][2]
point[dist][1] = deepcopy(command[0][3])#此处注意深浅拷贝问题
addcom([str(dist),str(command[0][0])])
#其他情况忽略该链
del command[0]
for i in range(k):
sr=input().split()
pp=int(sr[0])
update(int(sr[1])) # 先做可以生效的传递命令
if len(sr)==3:#如果是创建新块的命令
point[pp][0]+=1
point[pp][1].append(int(sr[2]))
addcom(sr)
else:#如果是查询命令
print(point[int(sr[0])][0],end="")
for item in point[int(sr[0])][1][0:-1]:
print(" ",item,end="")
print(" ",point[int(sr[0])][1][-1])
样例1输入:
5 10
1 2
1 3
1 4
1 5
2 3
2 4
2 5
3 4
3 5
4 5
1 27
1 1 1
2 1 2
3 1 3
4 1 4
5 1 5
1 1
2 1
3 1
4 1
5 1
1 2
2 2
3 2
4 2
5 2
1 10 10
2 11 9
1 11
2 11
3 11
4 11
5 11
1 12
2 12
3 12
4 12
5 12
样例2输入:
15 13
1 2
2 3
3 4
4 5
1 6
6 7
7 8
8 9
1 10
10 11
11 12
12 13
14 15
6 28
1 1 1
1 2 2
1 6
2 7
13 7
9 7
5 7
3 14
8 14
5 14
11 14
9 25
5 25
13 25
9 29 3
5 29 4
13 29 5
1 53
2 59 6
2 59
1 1000
3 1000
8 1000
9 1000
10 1000
13 1000
14 1000
15 1000
由于用的是python,很容易超时,只拿到了60分,但代码是没有问题的。为了验证代码我用c又写了一遍是100分。c代码可以去我另一篇博客看。