Files
luogu/P16055.md
T
2026-10-14 19:48:25 +08:00

100 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P16055 [CSPro 31] 坐标变换(其二)
## 题目背景
洛谷的测试数据仅供民间交流使用,非官方测试数据。官方评测链接:<https://www.cspro.org/>。
## 题目描述
对于平面直角坐标系上的坐标 $(x, y)$,小 P 定义了如下两种操作:
1. 拉伸 $k$ 倍:横坐标 $x$ 变为 $kx$,纵坐标 $y$ 变为 $ky$;
2. 旋转 $\theta$:将坐标 $(x, y)$ 绕坐标原点 $(0, 0)$ **逆时针**旋转 $\theta$ 弧度($0 \le \theta < 2\pi$)。易知旋转后的横坐标为 $x \cos \theta - y \sin \theta$,纵坐标为 $x \sin \theta + y \cos \theta$。
设定好了包含 $n$ 个操作的序列 $(t_1, t_2, \cdots, t_n)$ 后,小 P 又定义了如下查询:
- `i j x y`:坐标 $(x, y)$ 经过操作 $t_i, \cdots, t_j$($1 \le i \le j \le n$)后的新坐标。
对于给定的操作序列,试计算 $m$ 个查询的结果。
## 输入格式
从标准输入读入数据。
输入共 $n + m + 1$ 行。
输入的第一行包含空格分隔的两个正整数 $n$ 和 $m$,分别表示操作和查询个数。
接下来 $n$ 行依次输入 $n$ 个操作,每行包含空格分隔的一个整数(操作类型)和一个实数($k$ 或 $\theta$),形如 `1 k`(表示拉伸 $k$ 倍)或 `2 θ`(表示旋转 $\theta$)。
接下来 $m$ 行依次输入 $m$ 个查询,每行包含空格分隔的四个整数 $i、j、x$ 和 $y$,含义如前文所述。
## 输出格式
输出到标准输出。
输出共 $m$ 行,每行包含空格分隔的两个实数,表示对应查询的结果。
## 输入输出样例 #1
### 输入 #1
```
10 5
2 0.59
2 4.956
1 0.997
1 1.364
1 1.242
1 0.82
2 2.824
1 0.716
2 0.178
2 4.094
1 6 -953188 -946637
1 9 969538 848081
4 7 -114758 522223
1 9 -535079 601597
8 8 159430 -511187
```
### 输出 #1
```
-1858706.758 -83259.993
-1261428.46 201113.678
-75099.123 -738950.159
-119179.897 -789457.532
114151.88 -366009.892
```
## 说明/提示
### 样例解释
第五个查询仅对输入坐标使用了操作八:拉伸 $0.716$ 倍。
横坐标:$159430 \times 0.716 = 114151.88$
纵坐标:$-511187 \times 0.716 = -366009.892$
由于具体计算方式不同,程序输出结果可能与真实值有微小差异,样例输出仅保留了三位小数。
### 子任务
- $80\%$ 的测试数据满足:$n, m \le 1000$;
- 全部的测试数据满足:
- $n, m \le 10^5$;
- 输入的坐标均为整数且绝对值不超过 $10^6$;
- 单个拉伸操作的系数 $k \in [0.5, 2]$;
- 任意操作区间 $t_i, \cdots, t_j$($1 \le i \le j \le n$)内拉伸系数 $k$ 的乘积在 $[0.001, 1000]$ 范围内。
### 评分方式
如果你输出的浮点数与参考结果相比,满足绝对误差不大于 $0.1$,则该测试点满分,否则不得分。
### 提示
- C/C++:建议使用 `double` 类型存储浮点数,并使用 `scanf("%lf", &x);` 进行输入,`printf("%f", x);` 输出,也可以使用 `cin` 和 `cout` 输入输出浮点数;`#include <math.h>` 后可使用三角函数 `cos()` 和 `sin()`。
- Python:直接使用 `print(x)` 即可输出浮点数 `x`;`from math import cos, sin` 后可使用相应三角函数。
- Java:建议使用 `double` 类型存储浮点数,可以使用 `System.out.print(x);` 进行输出;可使用 `Math.cos()` 和 `Math.sin()` 调用三角函数。