#下面这一段用一个txt来保存input的信息来模拟input.最后提交代码时候删除这一段即可. a9999=open('1.txt','r') def input(): return a9999.readline() #结束. ''' 一闪一闪亮晶晶,满天都是小星星,牛牛晚上闲来无聊,便躺在床上数星星。 牛牛把星星图看成一个平面,左上角为原点(坐标为(1, 1))。现在有n颗星星,他给每颗星星都标 上坐标(xi,yi), 表示这颗星星在第x行,第y列。 现在,牛牛想问你m个问题,给你两个点的坐标(a1, b1)(a2,b2),表示一个矩形的左上角的点坐标 和右下角的点坐标,请问在这个矩形内有多少颗星星(边界上的点也算是矩形内)。 ''' #2维矩阵前缀和.用O(N)的速度来得到. a=[[0,0,1,1],[1,1,1,1],[0,1,1,0],[1,0,0,1]] b=[[0 for i in range(len(a[0]))] for i in range(len(a))] tmp=[0] for i in a: tmp.append(tmp[-1]+i[0]) tmp.pop(0) for i in range(len(b)): for j in range(len(b[0])): #b[i][j]表示矩阵a[i][j]到左上角组成的矩阵一共有多少个1. if i==0: b[i][j]=sum(a[i][:j+1]) elif j==0: b[i][j]=tmp[i] else: b[i][j]=b[i-1][j]+b[i][j-1]+a[i][j]-b[i-1][j-1] print(b)
具体写下来就是:
#下面这一段用一个txt来保存input的信息来模拟input.最后提交代码时候删除这一段即可. a9999=open('1.txt','r') def input(): return a9999.readline() #结束. ''' 一闪一闪亮晶晶,满天都是小星星,牛牛晚上闲来无聊,便躺在床上数星星。 牛牛把星星图看成一个平面,左上角为原点(坐标为(1, 1))。现在有n颗星星,他给每颗星星都标 上坐标(xi,yi), 表示这颗星星在第x行,第y列。 现在,牛牛想问你m个问题,给你两个点的坐标(a1, b1)(a2,b2),表示一个矩形的左上角的点坐标 和右下角的点坐标,请问在这个矩形内有多少颗星星(边界上的点也算是矩形内)。 ''' #2维矩阵前缀和.用O(N)的速度来得到. num=int(input()) #读入星星数据 a=[[0 for i in range(5)] for i in range(5)] for i in range(num): a1=[int(a) for a in input().split()] a[a1[0]][a1[1]]=1 #做前缀动态规划 b=[[0 for i in range(len(a[0]))] for i in range(len(a))] tmp=[0] for i in a: tmp.append(tmp[-1]+i[1]) tmp.pop(0) for i in range(1,len(b)): for j in range(1,len(b[0])): #b[i][j]表示矩阵a[i][j]到左上角组成的矩阵一共有多少个1. if i==1: b[i][j]=sum(a[i][:j+1]) elif j==1: b[i][j]=tmp[i] else: b[i][j]=b[i-1][j]+b[i][j-1]+a[i][j]-b[i-1][j-1] print(a) print(b) wenti=int(input()) for i in range(wenti): a1=[int(a) for a in input().split()] print(b[a1[2]][a1[3]]-b[a1[0]-1][a1[3]]-b[a1[2]][a1[1]-1]+b[a1[0]-1][a1[1]-1])