CSP坐标变换(其二)
暴力求解
读完题就暴力出结果,只能拿80分。时间复杂度太高,是 O ( m n ) O(mn) O(mn)。
转极坐标op列表
转极坐标,题目要求的改动则都是可逆的,可以创建一个改动列表op[n]
,op[i]
就是改动效果从1
叠加到i
的结果。
from math import cos, sin, sqrt, atan2
def change(coordinate, op):
if coordinate[0] == 1:
coordinate[2] *= op[coordinate[1]-1][0]
coordinate[3] += op[coordinate[1]-1][1]
else:
coordinate[2] *= op[coordinate[1]-1][0] / op[coordinate[0]-2][0]
coordinate[3] += op[coordinate[1]-1][1] - op[coordinate[0]-2][1]
def cartesian_to_polar(coordinate):
r = sqrt(coordinate[2]**2+coordinate[3]**2)
theta = atan2(coordinate[3], coordinate[2])
coordinate[2] = r
coordinate[3] = theta
def polar_to_cartesian(coordinate):
x = coordinate[2]*cos(coordinate[3])
y = coordinate[2]*sin(coordinate[3])
coordinate[2] = x
coordinate[3] = y
n, m = map(int, input().split())
changeLi = [list(map(float, input().split())) for i in range(n)]
'''get op'''
op = [[0, 0] for i in range(n)]
tempR = 1
tempTheta = 0
for i in range(n):
if changeLi[i][0] == 1:
tempR *= changeLi[i][1]
else:
tempTheta += changeLi[i][1]
op[i][0] = tempR
op[i][1] = tempTheta
for i in range(m):
coordinate = list(map(int, input().split()))
cartesian_to_polar(coordinate)
change(coordinate, op)
polar_to_cartesian(coordinate)
print('{0} {1}'.format(coordinate[2], coordinate[3]))