CSP 201912-4 区块链 (python)

文章目录

题目

在这里插入图片描述
由于考场上只剩下半个小时了,看这题目也有点难,就放弃了,现在有时间了,复盘了下。发现如果不太了解区块链,一开始真的连题目都看不懂,看了半天才看懂这题目啥意思。
简单的说就是,有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代码可以去我另一篇博客看。
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值