AcWing 5298. 坐标变换(其二)
原题链接
简单
作者:
zy4466
,
2024-04-22 12:24:53
,
所有人可见
,
阅读 1
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
typedef pair<double, double> PII;//存储伸缩和角度变化值
#define x first
#define y second
PII q[N];
int n, m;
//巧用前缀和进行优化
int main(){
cin >> n >> m;
q[0] = {1, 0};//用于存储初始时,k为1,伸缩一倍,角度旋转0度,这里注意初始化时是q[0]
for(int i = 1; i <= n; i ++ )
{
int a;
double k;
cin >> a >> k;
if(a == 1)//坐标伸缩
{
q[i].x = q[i - 1].x * k;//坐标伸缩成绩前缀和 * k
q[i].y = q[i - 1].y;//角度前缀和不变
}
else
{
q[i].x = q[i - 1].x;//坐标伸缩成绩前缀和不变
q[i].y = q[i - 1].y + k;//角度前缀和增加k
}
}
while(m -- )
{
int i, j, x, y;
cin >> i >> j >> x >> y;
double k = q[j].x / q[i - 1].x;
double s = q[j].y - q[i - 1].y;
double x1 = k * (x * cos(s) - y * sin(s));//注意这里要新增一个变量用于存储结果值,不能直接赋值给x
double y1 = k * (x * sin(s) + y * cos(s));//否则会导致算第二行的结果时,x值已经改变,数据被污染了
printf("%.3lf %.3lf\n", x1, y1);
}
return 0;
}