前缀和
要点:
对于每次查询对坐标进行变换时,不要拘泥于按给定操作顺序一次次进行变换
其实拉伸和旋转两个操作是独立的,可以先将所有的拉伸操作进行完,再进行旋转操作
拉伸操作用 前缀积 预处理,旋转操作用 前缀和 预处理
时间复杂度O(n + m)
import math
inputs = input().split()
n = int(inputs[0])
m = int(inputs[1])
a = [1]
b = [0]
for i in range(n):
line = input().split()
d = int(line[0])
v = float(line[1])
if d == 1:
a.append(v)
b.append(0)
else:
a.append(1)
b.append(v)
for i in range(1, n + 1):
a[i] *= a[i - 1]
b[i] += b[i - 1]
for k in range(m):
line = input().split()
i = int(line[0])
j = int(line[1])
x = int(line[2])
y = int(line[3])
x *= a[j] / a[i - 1]
y *= a[j] / a[i - 1]
temp = x
x = x * math.cos(b[j] - b[i - 1]) - y * math.sin(b[j] - b[i - 1])
y = temp * math.sin(b[j] - b[i - 1]) + y * math.cos(b[j] - b[i - 1])
print(x, y)