9月9日360 算法笔试
第一题
给定一个一维数组表示不同地方的高度,然后在一个地方倒水。倒水会使得相邻的低于此地高度的地方积水。问最多多少个地方积水。
第二题
有一个长度为n的棋子队列,初始情况为全正面。对其做q次操作,每次操作会将[a,b]区域内的棋子翻转。问每次操作过后的正面棋子个数。
解法
一开始想维持一个线段队列,然后记录每个队列的正反情况。但是发现在插入新的线段时,要考虑的情况太多了:新线段包含已有线段,新线段和其中一个相交等等。
所以新的想法就是每次就将线段的两端记录下来,每次遇到一端就翻转。统计正反的棋子个数。
n, q = [int(x) for x in input().split()] lines = [0, n] for _ in range(q): a, b = [int(x) for x in input().split()] lines.append(a-1) lines.append(b) lines = sorted(lines) c = 1 dic = {0:0, 1:0} prev = 0 for i in lines[1:]: cur = int(i) dic[c] += cur - prev c = 1 - c prev = cur print(dic[1])#360笔试#