CSP31次认证 T2 坐标变换(其二)

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]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值