AcWing 5298. 坐标变换(其二)-java
原题链接
简单
作者:
Masaka
,
2024-03-25 23:04:25
,
所有人可见
,
阅读 6
/*
从i到j进行操作可以分解为 从i到j拉伸k 以及从i到j旋转θ
这样分开的话就可以用前缀的思想来快速求解 k是前缀乘 θ是前缀和
k: 1 2 3 4 5...n
s: 1 2 6 24 120
从3到5 = s[5]/s[2]
a 1 2 3 4 5 .. n
s 1 3 6 10 15
从3到5 = s[5]-s[2]
*/
import java.util.*;
import java.math.*;
public class Main{
static int N=100010;
static int n,m;
static double k[]=new double[N];
static double a[]=new double[N];
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
//处理前缀
k[0]=1;
for(int i=1;i<=n;i++){
int op=sc.nextInt();
double x=sc.nextDouble();
if(op==1){
k[i]=k[i-1]*x;
//空余的部分用0来填充 即前缀乘/和不变
a[i]=a[i-1];
}
if(op==2){
a[i]=a[i-1]+x;
k[i]=k[i-1];
}
}
while(m-->0){
int i=sc.nextInt();
int j=sc.nextInt();
double x=sc.nextDouble();
double y=sc.nextDouble();
x*=k[j]/k[i-1];
y*=k[j]/k[i-1];
double x1=x;
double y1=y;
double t=a[j]-a[i-1];
x=x1*Math.cos(t)-y1*Math.sin(t);
y=x1*Math.sin(t)+y1*Math.cos(t);
System.out.printf("%.3f %.3f",x,y);
System.out.println();
}
}
}