python 3 52分 TLS,求调
查看原帖
python 3 52分 TLS,求调
1502093
waywalon楼主2024/10/12 11:41

社区的python题解太少了,不知道有没有大佬愿意调一下,后面#14就开始TLS了,我太弱了

# 读取数组数量n, 操作数k
n, k = [int(i) for i in input().split()]
a = [int(i) for i in input().split()]
# sorted_a: m*2 list, a[i][1]为数组a索引为a[i][0]时的值
sorted_a = [[i[0]+1, i[1]] for i in sorted(enumerate(a), key=lambda x: x[1])]

# 判断a[i]和a[j]关于value的排序关系
def is_righter_item(item1, item2):
    if item1[1] == item2[1]:
        return item1[0] > item2[0]
    else:
        return item1[1] > item2[1]

for i in range(k):
    op = input().split()
    # 第一种操作
    if op[0] == "1":
        # 判断是否改的值与原值相同
        is_same = False
        # 查找修改项,最坏情况o(n)
        for item in sorted_a:
            if item[0] == int(op[1]):
                if int(op[2]) == item[1]:
                    is_same = True
                else:
                    # 修改值并remove
                    item[1] = int(op[2])
                    sorted_a.remove(item)
                break
        # 等于没动,不操作
        if is_same:
            continue
        # 判断区间端点情况
        if not is_righter_item(item, sorted_a[0]):
            sorted_a = [item] + sorted_a
        elif is_righter_item(item, sorted_a[-1]):
            sorted_a += [item]
        # 满足sort_a[0] < item < sort_a[-1], 二分法求插入索引, o(logn)
        else:
            start, end = 0, len(sorted_a)-1
            while end - start > 1:
                middle = (start + end) // 2
                if is_righter_item(item, sorted_a[middle]):
                    start = middle
                else:
                    end = middle
            sorted_a.insert(end, item)
    elif op[0] == "2":
        # 查找满足项,最坏情况o(n)
        for item in sorted_a:
            if item[0] == int(op[1]):
                print(sorted_a.index(item)+1)
                break
2024/10/12 11:41
加载中...